遞歸溶液:
- 生成從000到999的所有數字,並使用
n % 111
來檢查 每個數字是否爲111的倍數。如果是,請將標誌設置爲true。
- 對這些數字中的每一個,添加一個數字,範圍爲0-9,如果數字的標誌爲假,則使用檢查最後三位數字是否相等,如果是,則將該標誌設置爲true。
- 以遞歸方式重複上一步,直至達到7位數。
- 然後,對於每個7位數的數字,如果其標誌爲真,則將00-99的完整範圍作爲最後兩位數字(生成一百個9位數 數字)。
- 如果該標誌爲假,則使用
(n % 100) % 11
檢查是否最後 兩個數字是相等的,並且如果是這樣,添加第三個相等數字和 然後最後一位範圍內的0-9(產生10 9位數 數字)。
- 如果最後兩位數字不相等,則添加兩位數字,等於 最後一位數字(生成一個9位數字)。
這裏有一個簡單的JavaScript實現。只計算結果很快,但如果打開打印,則對於超過6位的數字,只需幾分鐘而不是幾秒。
function repeatingDigits(len) {
for (var n = 0; n < 1000; n++) {
var flag = n % 111 ? false: true;
add_digit(10 * n, flag, len - 3);
}
}
function add_digit(n, flag, len) {
for (var d = 0; d < 10; n++, d++) {
var f = (!flag && (n % 1000) % 111 == 0) ? true : flag;
if (len > 3) add_digit(10 * n, f, len - 1)
else add_final(100 * n, f);
}
}
function add_final(n, flag) {
if (flag) {
for (var d = 0; d < 100; n++, d++) {
++count; // document.write(n + " ");
}
}
else if ((n % 10000) % 1100 == 0) {
n += (n % 1000)/10;
for (var d = 0; d < 10; n++, d++) {
++count; // document.write(n + " ");
}
}
else {
n += ((n % 1000)/100) * 11;
++count; // document.write(n + " ");
}
}
var count = 0;
repeatingDigits(9);
document.write(count);
有3個或多個數字重複組整數的個數是:
3 digits: 10
4 digits: 190
5 digits: 2,800
6 digits: 36,910
7 digits: 457,390
8 digits: 5,448,700
9 digits: 63,154,810
10 digits: 717,431,590
11 digits: 8,025,277,600
12 digits: 88,684,382,710
來源
2017-06-06 02:47:20
m69
是列出所有這些或只是爲了統計它們的任務嗎? – Dukeling
在生成具有如此巨大數值的數組時,有什麼用處?您可能不會單獨考慮這些數值,或者如果這樣做,您的其餘生活計劃可能會被埋藏;-) – trincot
@ dasblinkenlight它不!接得好! – amingilani