1. 程式人生 > >演算法訓練 寂寞的數

演算法訓練 寂寞的數

問題描述   道德經曰:一生二,二生三,三生萬物。
  對於任意正整數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
#include<stdio.h>
#include<string.h>
int main()
{
	int n,k,i,sum;
	int arr[10050];				//陣列要稍微定大一些,因為下面的sum會大於10000,不然會執行超時。 
	scanf("%d",&n);
	memset(arr,0,sizeof(arr));
	for(i=1;i<=n;i++)
	{
		k=i;
		sum=k;
		while(k)
		{
			sum+=k%10;
			k/=10;
		}
		arr[sum]=1;
	}
	for(i=1;i<=n;i++)
	{
		if(arr[i]==0)
			printf("%d\n",i);
	}
	return 0;
}