本文共 1164 字,大约阅读时间需要 3 分钟。
道德经曰:一生二,二生三,三生万物。
对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。 因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))…例如,从33开始的递增序列为: 33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, … 我们把n叫做d(n)的生成元,在上面的数列中,33是39的生成元,39是51的生成元,等等。有一些数字甚至可以有两个生成元,比如101,可以由91和100生成。但也有一些数字没有任何生成元,如42。我们把这样的数字称为寂寞的数字。 输入格式 一行,一个正整数n。 输出格式 按照升序输出小于n的所有寂寞的数字,每行一个。 例子样例输入
40 样例输出 1 3 5 7 9 20 31 数据规模和约定n<=10000
提示请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型从前到后依次遍历,求出每一个数的d(n),然后将其在数组中标记为1,则最后没有标记出来的数就是寂寞的数~~
代码:
#includeint alone[10010]={ 0};int main(){ int N; int k; int sum; scanf("%d", &N); int i; for(i = 1; i <= N; ++i) { k = i; sum = i; while(k) { sum += k % 10; //求出来i的d(n); k /= 10; } alone[sum] = 1; //将这个求出来的数标记为1 } for(i = 1; i < N; ++i) { if(alone[i] == 0) //没有标记出来的数就是寂寞的数 printf("%d\n", i); } return 0;}
转载地址:http://xprzi.baihongyu.com/