演算法訓練 寂寞的數
阿新 • • 發佈:2019-02-14
問題描述
道德經曰:一生二,二生三,三生萬物。
對於任意正整數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
對於任意正整數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。我們把這樣的數字稱為寂寞的數字。
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; }