SP12304 题解

原题链接 | 题解链接

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

1|0题目简述

i所有正因数= n 时, 其中 i最小值

2|0思路

首先需要完成求一个数的所有正因数之和的函数 f(n)。 要求此函数可返回传入参数的所有正因数之和, 那么直接遍历 1n, 如果当前 in 的因数, 加入计和变量 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 要开 longlong, 不然可能会爆。

接着在主函数中就可枚举 i, 如果 f(i)=n 即可输出当前 i, 并停止枚举; 如果当前 i>n, 那么 f(i) 一定大于 n, 因为 i>nii因数。所以此时就可停止枚举, 并输出 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; }

__EOF__

本文作者So_noSlack
本文链接https://www.cnblogs.com/So-noSlack/p/17560570.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   So_noSlack  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示