【发布时间】:2017-09-03 10:32:42
【问题描述】:
我一直在尝试解决 Project Euler 上的第 5 个问题,就像
2520 是可以除以 1 到 10 的每个数字而没有余数的最小数字。
能被 1 到 20 的所有数整除的最小正数是多少?
我决定更进一步,我决定让它找到可以被从 1 到 limit 的所有数字整除的最小正数,其中 limit 是用户定义的。
当我执行我的程序时问题开始了,它立即打印出 0。我尝试跟踪我的代码,但没有成功。
#include <iostream>
using std::cout;
using std::cin;
bool isRemainderFree(int num, int limit){
bool bIsRemainderFree = true;
if(num < limit){
bIsRemainderFree = false;
}else{
for(int i=1; i <= limit; i++){
if(num % i != 0){
bIsRemainderFree = false;
break;
}
}
}
return bIsRemainderFree;
}
int smallestMultiple(int limit){
int smallestNum = 10;
for(int i=1; i <= limit; i++){
bool bFree = isRemainderFree(i, 10);
if(bFree){
cout << i << " is divisible by all numbers from 1 to " << limit << ".\n";
smallestNum = i;
return smallestNum;
break;
}
}
}
int main(){
int limit;
cin >> limit;
int smallestNum = smallestMultiple(limit);
cout << smallestNum;
return 0;
}
【问题讨论】:
-
使用调试器逐行执行代码时,您观察到了什么?
-
@user0042 我认为这似乎是正确的,应该按预期运行,但我显然错了。不过,我对 minimumMultiple 函数有疑问。我觉得isRemainderFree函数还可以。
-
我认为你必须在
main()中初始化你的limit。就像一些低的测试,然后 20 来解决问题。 -
@arbuthnott 我只是这样做了,没有任何改变。
-
smallestMultiple中的 for 循环仅检查到limit,即检查从 1 到 10 的任何值除以从 1 到 10 的每个数字时是否没有余数。你需要增加它限制大小(例如,10 的大小超过 2520)。你传递给isRemainderFree的 10 代表除数,所以你不会失去让i范围更高。