如何找到可以除以所有数字的最小数字1:n没有余数?

时间:2017-09-03 10:32:42

标签: c++ algorithm

我一直试图在Project Euler上解决第5个问题,就像

一样
  

2520是可以除以1到10之间的每个数字的最小数字,没有任何余数。

     

从1到20的所有数字均可被整除的最小正数是多少?

我决定更进一步,我决定让它找到可以被1到限制的所有数字整除的最小正数,其中限制是用户定义的。

问题在我执行程序时开始,它立即打印出来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;
}

1 个答案:

答案 0 :(得分:3)

答案应该只是所有数字的LCM,可以通过以下方式轻松完成

int gcd(int a, int b){
    if(b==0)
        return a;
    return gcd(b, a%b);
}
int main() {
    int limit = 10, lcm = 1;
    for(int i=1; i<=limit; i++){
        lcm = (lcm * i)/gcd(lcm,i);
    }
    printf("%d\n", lcm); // prints 2520
    return 0;
}