SP12304 题解

发布时间 2023-07-17 16:55:12作者: So_noSlack

原题链接 | 题解链接

本篇题解为此题简单做法较少码量, 并且码风优良, 请放心阅读。

题目简述

\(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;
}