递归训练:1.个位数统计,2.十进制转二进制输出(分析子问题)

【问题描述】
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;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40163242/article/details/88077834