一个数的所有整数除数之和

Sum of all integer divisors of a number

我想求一个数的所有除数之和,即如果这个数是 6,我想得到 1+2+3+6=12。我的尝试是:

#include <iostream>

using namespace std;

int divisorsSum(int n){
    int sum=0;
    for (int i=1; i<=n; i++){
        if(n%i==0)
            i=sum+i;

    }
    return sum;
}

int main()
{
    cout<<divisorsSum(6);
}

然而令人惊讶的是它根本不起作用,它returns什么都没有,我无法弄清楚我的代码有什么问题。

因此问题是如何让它发挥作用? 顺便说一句:立即对我不是专家的所有内容投反对票是没有意义的,是的,我确实犯了错误。

int divisorsSum(int n){
    int sum=0;
    for (int i=1; i<=n; i++){
         if(n%i==0)
            sum+=i;

    }
return sum;
}
  1. i 从 1 开始而不是 i
  2. sum+=i 而不是 i=sum+i

您的代码中有几个问题。

int i = i;

i仍未定义。你可能想要 i = 1

i = sum + i;

sum 上面没有更新。你可能想要 sum += i

您需要更改函数 divisorsSum 以使用以下代码:

int divisorsSum(int n)
{
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        if(n % i == 0)
        sum += i;
    }
    return sum;
 }
for (int i=i; i<=n; i++)

将 i=i 更改为 i = 1

也许有更好的算法来求一个数的约数,但这里是您的代码的正确版本。

int divisorsSum(int n){
    int sum=0;
    for (int i = 1; i <= n; ++i){
       if(n % i == 0)
            sum += i;

    }
    return sum;
}

这里有一个稍微优化的版本,如果i大于n的一半,那么i不能是n的约数。

int divisorsSum(int n) {
    int sum=0;
    for (int i = n / 2; i >= 1; --i){
       if(n % i == 0)
            sum += i;

    }
    return sum;
}