问题:2520 是可以除以 1 到 10 的每个数字而没有余数的最小数字。
能被 1 到 20 的所有数整除的最小正数是多少?
所以,我试图在项目 euler 上做练习 5,我得出了以下代码:
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int main () {
int n, fnd = FALSE, count, i;
for (i = 1; fnd == FALSE; i++) {
count = 0;
for (n = 1; n <= 20; n++) {
count += i % n;
}
printf ("testing %d, count was: %d\n", i, count);
if (count == 0) {
fnd = TRUE;
printf ("%d\n", i);
}
}
return 0;
}
我相信我的方法是正确的,它肯定会找到可被 1 到 20 整除的数字。但是它已经计算了 5 分钟,仍然没有结果。我的方法正确吗?如果是,那么还有其他方法吗?我想不出另一种方法来解决这个问题,非常感谢提示。先感谢您。
编辑:所以,根据你们给我的建议,我想通了,非常感谢!所以,它仍然是蛮力,但不是在最后一个数字上加 1,而是现在加 2520,即 1 到 10 的 LCM。因此,计算 2520 的倍数的余数之和是否从 11 到20 是 0。由于 2520 已经可以被 1 整除到 10,所以我只需要除以 11 到 20。
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int main () {
int n, fnd = FALSE, count, i;
for (i = 2520; fnd == FALSE; i = i + 2520) {
count = 0;
for (n = 11; n <= 20; n++) {
count += i % n;
}
printf ("testing %d, count was: %d\n", i, count);
if (count == 0 && i != 0) {
fnd = TRUE;
printf ("%d\n", i);
}
}
return 0;
}
非常感谢,如果没有你的帮助,我不会解决它 :) PS:它现在计算时间不到 10 秒。