链接: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;
}