给定一个自然数n,由n 开始可以依次产生半数单集set(n)中的数如下。
(1) n∈set(n);
(2) 在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数单集set(6)中有6 个元素。 注意半数单集不是多重集。即集合中没有重复元素。
输入n输出对应的集合元素个数及对应的集合。
例:输入6,则输出set(6)={6,16,26,126,36,136},元素个数为6。
测试数据25。
运行截图:
代码如下:
//半数单集问题
#include<stdio.h>
#include<math.h>
//set存储数集,u存储个数
int set[10000], u = 0;
//求整数的位数
int digit(int n)
{
int i = 0;//收集位数
while (n/10 != 0)//循环除10求位数
{
i++;
n = n/10;
}
return i;//返回位数
}
//查重
int repeat(int x)
{
int sign = 0;//初始值为0
for(int i = 0; i < u; i++)//遍历
{
if(set[i] == x)//如果有重复则为 1
{
sign = 1;
}
}
return sign;
}
//求半数单集
int banshu(int n, int m)
{
if(!repeat(m))//检查是否数值有重复
{
set[u++] = m;
}
for(int i = 1; i <= n/2; i++)
{
banshu(i , i * pow(10,digit(m) + 1) + m);//循环递归
}
}
int main()
{
//输入
printf("请输入你要求的数:\n");
int number;
scanf("%d",&number);
//运算
banshu(number, number);
//输出
printf("set(%d)={\n",number);
for(int i = 0; i < u; i++)
{
if(i != u - 1)
printf("%10d,",set[i]);
else
printf("%10d",set[i]);
if((i+1) % 10 == 0)
printf("\n");
}
printf("\n },");
printf("元素个数为%d",u);
return 0;
}
谢谢浏览,如果对你有用点个赞呗