題目:1949年,印度數學家D.R.Kaprekar發現了一類稱為自數(self-number)的數。
對任意的正整數n,定義d(n)是n與n每一位的總和再相加(d是代表digitadition,Kaprekar創造的術語)。例如,d(75) = 75 + 7 + 5 = 87。列出任意正整數n作為起始點,可始建構整數n的無限增量序列:d(n),d(d(n)),d(d(d(n))),⋯。例如,如果以33作為起始點,下一個數是33 + 3 + 3 = 39,再下一個數是39 + 3 + 9 =51,再下一個數是51 + 5 + 1 = 57,可以產生序列33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141,⋯。
整數n被稱為d(n)的生成數,在上述序列中,33是39的生成數,39是51的生成數,51是57的生成數,等等。一些數有一個以上的生成數:例如,101有兩個生成數,91和100。
沒有生成數的數稱為自數。在100內有13個自數:1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86和96。
輸入:沒有輸入。
輸出:寫一個程式,以遞增的次序輸出少於10000的自數,每個數一行。
public class SelfNumbers { final int N = 10000; int g[]; public int sumOfDigits(int n) { if (n < 10) return n; return (n % 10) + sumOfDigits(n / 10); // 計算n的各位數字之和 } public void generateSequence(int n) { // 建構整數nh旳無限增量序列 while (n < N) { int next = n + sumOfDigits(n); // 計算d[n] if (next >= N || g[next] != next) // 若d[n]起過上限或非自數則返回 return; g[next] = n; // 將d[n]放n的無限增量序列 n = next; } } public SelfNumbers() { int n; g = new int[N]; for (n = 1; n < N; ++n) { // 最初假設所有數為自數 g[n] = n; } for (n = 1; n < N; ++n) { generateSequence(n); } for (n = 1; n < N; ++n) { if (g[n] == n) // 輸出篩中滿足g[x]=x條件的自數 System.out.printf("%d\n", g[n]); } } public static void main(String[] args) { SelfNumbers sn = new SelfNumbers(); } }
鏈結到這頁!