洛谷——P1851 好朋友

题目:来源于洛谷
小可可和所有其他同学的手腕上都戴有一个射频识别序列号码牌,这样老师就可以方便的计算出他们的人数。很多同学都有一个“好朋友” 。如果 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;
}

(●ˇ∀ˇ●)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值