技术,瞎侃,健康,休闲……

mahu@cppblog 人类的全部才能无非是时间和耐心的混合物
posts - 11, comments - 13, trackbacks - 0, articles - 12
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Self Numbers

Posted on 2006-06-16 23:32 mahudu@cppblog 阅读(792) 评论(0)  编辑 收藏 引用 所属分类: C/C++
   

In 1949 the Indian mathematician D.R. Kaprekar discovered a class

of numbers called self-numbers. For any positive integer n, define

d(n) to be n plus the sum of the digits of n. (The d stands

for digitadition, a term coined by Kaprekar.) For example, d(75) = 75 + 7 + 5 = 87. Given any positive integer n as a starting

point, you can construct the infinite increasing sequence of integers

n, d(n), d(d(n)), d(d(d(n))), .... For example, if you start with

33, the next number is 33 + 3 + 3 = 39, the next is 39 + 3 + 9 = 51, the next

is 51 + 5 + 1 = 57, and so you generate the sequence

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

The number n is called a generator of d(n). In the

sequence above, 33 is a generator of 39, 39 is a generator of 51, 51

is a generator of 57, and so on. Some numbers have more than one

generator: for example, 101 has two generators, 91 and 100. A number

with no generators is a self-number. There are thirteen

self-numbers less than 100: 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86,

and 97.

Write a program to output all positive self-numbers less than 10000

in increasing order, one per line.

Output

1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

Solution

#include <iostream>
using namespace std;

const long N = 10000;     //最大自然数
char Arr[N + 9*4]={0};   //是否是被排除的数字? +9*4是为了要再多放4位数

long DealNum(long n)
{
  
long sum = n;
  
while (n != 0)
  
{
    sum 
+= n%10;
    n 
/= 10;
  }

  
return sum;
}


int main()
{
  
int i;
  
for(i = 1; i < N; i++)
  
{
    Arr[DealNum(i)] 
= 1;
  }

  
for(i = 1; i < N; i++)
  
{
    
if (!Arr[i])
        cout
<<i<<endl;
  }

  
return 0;
}



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理