递归溶液:
- 生成从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