任务描述 本关任务:编写一个能求20000以内的亲密对数的小程序。 编程要求 求20000以内的亲密对数。所谓亲密对数,即A除了整数本身外的所有因子之和等于B,B除了整数本身外的所有因子之和等于A。 要求:编写函数来求某数的除了整数本身外的所有因子之和(注意1是任何整数的因子)。 格式要求: 用户输入正整数n表示希望输出第n对亲密对数(按照数值递增方式排列亲密对数)。例如,如果用户输入"1",程序输出"220 284"表示:第1对亲密对数是220和284(先输出值较小的那个数,然后一个空格,再输出值较大的那个数)。 提交代码时不能有其他多余的cin和cout语句 效果如下: 输入:1 输出:220 284 开始你的任务吧,祝你成功!
时间: 2024-02-06 11:13:03 浏览: 86
FFT.zip_fft功率谱_fft求功率谱_对数谱_数据求功率谱_绝对功率谱
5星 · 资源好评率100%
好的,我已经明白了您的要求。下面是我的代码:
```c++
#include <iostream>
using namespace std;
int sum(int n) // 求除了整数本身外的所有因子之和
{
int s = 1;
for(int i = 2; i * i <= n; i++)
if(n % i == 0)
s += i + n / i;
if(n % (int(sqrt(n))) == 0) // 如果n是完全平方数
s -= int(sqrt(n)); // 避免重复加上sqrt(n)
return s;
}
int main()
{
int n;
cin >> n;
int cnt = 0;
for(int i = 1; i <= 20000; i++)
{
int s1 = sum(i);
if(s1 > i && s1 <= 20000 && sum(s1) == i) // 满足亲密对数定义
{
cnt++;
if(cnt == n)
{
cout << i << " " << s1 << endl;
break;
}
}
}
return 0;
}
```
我们先定义了一个 `sum` 函数,用于求除了整数本身外的所有因子之和。接下来,在主函数中,我们从1开始枚举所有小于等于20000的正整数,对于每一个数,我们先求出它的因子之和 `s1` ,如果 `s1` 大于这个数且不超过20000,且 `s1` 的因子之和等于这个数,那么就说明这两个数是一对亲密对数。如果找到了第 `n` 对亲密对数,就输出并结束循环。
注意,我们在求因子之和的时候,可以从2到sqrt(n)枚举可能的因子,这样可以将复杂度降到O(sqrt(n))。此外,如果n是完全平方数,那么它的sqrt(n)会被重复加上,因此需要将它减去一次。
希望我的代码能够满足您的要求,有任何问题请随时问我。
阅读全文