【问题描述】
L1-003 个位数统计 (15 分)
给定一个 k 位整数 ,请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1
【思路】:
最近做递归真的是做嗨了!这题一看也可以用递归来写,由于这里的n是大整数,所以不能用int,那就只能用字符串String来对付了。思路就是设 f ( n )表示字符串s的前n位的个位数统计(我将结果存到数组里 去,然后最后一起输出)
所以递归式应该就是:f(n) = 对第n位的字符进行处理 + f(n - 1)
AC代码:
#include<iostream>
using namespace std;
string s;
const int maxn = 10;
int a[maxn];
void f(int n) //表示字符串s前n位的个位数字的情况(存到a数组里)
{
int x = s[n] - '0'; //这个注意'0'
a[x]++;
if(n != 0) //边界n == 0
f(n - 1);
}
int main()
{
cin >> s;
int len = s.size();
f(len - 1);
for(int i = 0;i <= 9;i++)
{
if(a[i] != 0)
{
cout << i << ":" << a[i] << endl;
}
}
return 0;
}
【问题描述】
将一个十进制数n以二进制形式输出
【思路】
我们不妨写几项
1: 1
2: 10
3: 11
4: 100
5: 101
6: 110
7: 111
8:1000
9:1001
10:1010
…
例如7吧。如果我们要输出7的二进制111,那么我们首先得输出前面的11,也就是说我们得先把7 / 2的二进制输出出来,那么最后一位偶数就输出0,奇数就输出1,不就搞定了吗?
所以f(n) = f(n / 2) + if(n % 2 == 0)—then: 输出0 else—输出1
参考代码:
#include<iostream>
using namespace std;
void f(int n) //将n以二进制的形式输出
{
if(n == 0)
return ;
f(n / 2);
if(n % 2 == 0)
cout << 0;
else
cout << 1;
}
int main()
{
int n;
cin >> n;
f(n);
return 0;
}
运行结果: