48.约数之和(重要)

57 阅读2分钟

链接:ac.nowcoder.com/acm/problem…
来源:牛客网

题目描述

求自然数N的所有约数之和。

输入描述:

输入一行,包含一个正整数n,范围在10000以内

输出描述:

输出一行,包含一个整数.

示例1

输入

10

输出

18

解法一:暴力解

1.先写框架和获取n的值,定义sum为约数之和

#include  <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int sum = 0;
    return 0;
}

2.从1循环到n,找到符合的约数,加到sum里面,最后输出

#include  <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1;i <= n;i ++){
        if(n % i == 0){
            sum += i;
        }
    }
    cout << sum;
    return 0;
}

2.试除法求约数的平方根优化(重要)

它是基于以下两个数学性质:

  • 约数对称性:约数总是成对出现

  • 平方根分界点:在所有约数对中,一个小于等于 n​,另一个大于等于 n​

1.先写框架和获取n的值,定义sum为约数之和

#include  <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int sum = 0;
    return 0;
}

2.从1到n遍历到√ ̄n 找到符合的较小的约数,加到sum里面

#include  <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1;i * i <= n; i++){
        if(n % i == 0){
            sum += i;
        }
    }
    return 0;
}

3.接着找较大的约数,但两个约数不可相等,最后输出

  • 每找到一个小约数i,就可以同时找到对应的大约数n/i

  • 特别注意:当n是完全平方数时(比如16),要避免重复计算平方根(比如4)

#include  <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1;i * i <= n; i++){
        if(n % i == 0){
            sum += i;
            if(n != n/i){
                sum += n/i;
            }
        }
    }
    cout << sum;
    return 0;
}