本篇题解为此题最较简单做法及最较少码量, 并且码风优良, 请放心阅读。
题目简述
当 \(i\) 的所有正因数和 \(=\) \(n\) 时, 其中 \(i\) 的最小值。
思路
首先需要完成求一个数的所有正因数之和的函数 \(f(n)\)。 要求此函数可返回传入参数的所有正因数之和, 那么直接遍历 \(1 - n\), 如果当前 \(i\) 是 \(n\) 的因数, 加入计和变量 \(sum\) 中, 最后返回 \(sum\) 的值即可。
示例 :
int f(int n) {
long long sum = 0;
for(int i = 1; i <= n; i ++)
if(!(n % i)) sum += i;
return sum;
}
注意 : \(sum\) 要开 \(long long\), 不然可能会爆。
接着在主函数中就可枚举 \(i\), 如果 \(f(i) = n\) 即可输出当前 \(i\), 并停止枚举; 如果当前 \(i > n\), 那么 \(f(i)\) 一定大于 \(n\), 因为 \(i > n\) 而 \(i\) 为 \(i\) 的因数。所以此时就可停止枚举, 并输出 \(-1\)。
具体枚举可参考 :
while(true) {
sum = f(i ++); // 计算因数和
if(i - 1 > n) break; // 如果当前 i > n 直接 break
if(sum == n) {
flag = true;
cout << i - 1 << endl; // 满足情况, 输出并 break
break;
}
}
if(!flag) cout << "-1\n";
注意 : 当 \(sum = n\) 时, 一定要标记并停止枚举!
最后只需要注意每组数据处理时, 记得初始化各个变量的值即可。
完整代码如下 :
#include<iostream>
using namespace std;
long long T, n, sum = 0, num = 1;
bool flag = false;
long long f(long long m) {
long long summ = 0;
for(long long i = 1; i <= m; i ++)
if(!(m % i)) summ += i;
return summ;
}
int main() {
cin >> T;
while(T --) {
num = 1, sum = 0, flag = false;
cin >> n;
while(true) {
sum = f(num ++);
if(num - 1 > n) break;
if(sum == n) {
flag = true;
cout << num - 1 << endl;
break;
}
}
if(!flag) cout << "-1\n";
}
return 0;
}
标签:题解,sum,SP12304,枚举,long,因数,flag
From: https://www.cnblogs.com/So-noSlack/p/17560570.html