题目:来源于洛谷
小可可和所有其他同学的手腕上都戴有一个射频识别序列号码牌,这样老师就可以方便的计算出他们的人数。很多同学都有一个“好朋友” 。如果 A 的序列号的约数之和恰好等于 B 的序列号,那么 A 的好朋友就是 B。在这里,一个数的约数不包括这个数本身。因为一些同学的号码约数和大于其他任何同学的号码,所以这些同学没有好朋友。一些同学有一个“非常好友” 。当两个同学互为“好朋友”时,他们就是一对“非常好友” 。注意在这道题中,忽略那些自己是自己的“非常好友”的情况。
给定一个序列号 s,找出序列号不小于 s 的第一对“非常好友” 。
输入格式
只有一行一个整数 ss,即给定的序列号下界。
输出格式
输出一行两个用空格隔开的整数 a 和 b。
a 表示第一个序列号不小于 s 的有“非常好友”的同学,b 是 a 的“非常好友” 。(注:允许 b<s)
输入输出样例
输入 #1
206
输出 #1
220 284
分析:
题目要找的是第一对“好朋友”,所以从S开始往后遍历,直到找到为止。
求约数之和的函数:由于一个正整数(如果是偶数),最大的约数是这个整数的一半。
还要注意:S==B && B!=A 这个判断条件,可以把输出样例代入理解。
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int S,A,B;
//求约数之和
int num_sum(int n) {
int sum = 0;
for (int i = 1; i <= n/2; i++) {
if (0==n%i) {
sum += i;
}
}
return sum;
}
int main()
{
scanf("%d", &S);
//找第一对
while (S++) {
A = num_sum(S);
B = num_sum(A);
if (S==B && B!=A) {
printf("%d %d", B, A);
break;
}
}
return 0;
}
(●ˇ∀ˇ●)