FZU - 1207 半数集问题(集合概念)

版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 https://blog.csdn.net/weixin_42172261/article/details/88880345

给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。
(1)n∈set(n); (2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3)按此规则进行处理,直到不能再添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6个元素。
注意 半数集不是多重集。集合中已经有的元素不再添加到集合中。
编程任务
对于给定的自然数n,编程计算半数集set(n)中的元素个数。
Input
本题有多组输入数据,你必须处理到EOF为止。
每组数据只有1行,给出整数n。(0<n<201)
Output
对于每组数据,输出只有1行,给出半数集set(n)中的元素个数。
Sample Input
6
Sample Output
6
因为是不能出现重复的数,所以每次要去掉重复的。如果是100,那么它产生的数可以是24 100,而这个数也可以由2 4 100得到,所以存在重复。i从1开始向n/2遍历,i是1的时候只有1种,i是2的时候也是1种,当i是3的时候,又开始另一个i从1到3/2遍历这时就会加上以n为基数前面加上3的时候的情况数。
(i/10)<=(i%10/2)就是i的除去低位后的数如果小于等于最低位的一半的话,就可能产生上面的情况,就要减去这个重复。

#include <iostream>
#include <cstdio>
using namespace std;

int a[205]={0};
int halfset(int n)
{
	if (a[n]==0){
		int sum=1;
		for (int i=1; i<=n/2; i++){
			sum+=halfset(i);
			if (i>9 && (i/10)<=(i%10/2))
				sum-=halfset(i/10);
		}
		a[n]=sum;
	}
	return a[n];
}
int main()
{
	int n;
	while (scanf("%d", &n)!=EOF){
		printf("%d\n", halfset(n));
	}
	return 0;
}

当然,如果不需要去重的话,就不用判断了。

#include <iostream>
#include <cstdio>
using namespace std;

int a[205]={0};
int halfset(int n)
{
	if (a[n]==0){
		int sum=1;
		for (int i=1; i<=n/2; i++){
			sum+=halfset(i);
		}
		a[n]=sum;
	}
	return a[n];
}
int main()
{
	int n;
	while (scanf("%d", &n)!=EOF){
		printf("%d\n", halfset(n));
	}
	return 0;
}

PS:写给自己的笔记,大佬勿喷。

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/88880345