【问题标题】:How do I find the smallest number than can be divided by all numbers 1:n with no remainder?如何找到可以除以所有数字 1:n 且没有余数的最小数字?
【发布时间】: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 范围更高。

标签: c++ algorithm


【解决方案1】:

答案应该只是所有数字的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;
}

【讨论】:

    【解决方案2】:

    Python代码

    import math
       
    # Returns the lcm of first n numbers
    def lcm(n):
        ans = 1
        for i in range(1, n + 1):
            ans = int((ans * i)/math.gcd(ans, i))        
        return ans
       
    # main
    n = 20
    print (lcm(n))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多