uva10791(数论)

该博客探讨了UVA10791数论题目,主要内容涉及找到两个或多个数字,使得这些数字除以它们的最大公约数后相乘的结果乘以最大公约数等于给定数字n,并且这些数之和最小。博主通过分析指出,当数字的最大公约数为1时,和最小。解题策略包括将数字分解为其因子并求和,对于质数则直接加1。由于遍历所有因子会导致超时,因此只需遍历到n的平方根。若遍历结束后存在非1的因子,说明存在大于平方根的因子,需额外加入。最后,博主提供了AC(Accepted)代码作为解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个数字n.

然后你要找出2个或2个以上的数字.使这些数字除以他们的最大公约数,得到的结果全部相乘,在乘以最大公约数等于n ; 这些数的和最小.

例如

12  3,4的最大公约数1,除完是3,4,结果是3*4*1 = 12;

24  3,8的最大公约数1,除完是8,3,结果是3*8*1 = 24;

可以得到,我们要找出的数,如果这些数的最大公约数是1,则和最小.

那么我们就把这个数分解,把所有因子2乘起来作为一个数字.把所有因子3乘起来做一个数..最后全加起来就行了.

但是如果是质数,直接就是本身加1;

如果这个数分解完只有一个因子.比如8,9,那么值也是本身加1;

因为遍历全部会超时,所以遍历到sqrt(n);

那么就要在注意一点.

例如10分出2,5但是遍历到sqrt(10),得不到5;所以要判断最后的一直除的结果是不是1;

如果不是,说明有一个大于sqrt(10)的因子(肯定只有一个);结果在加上这个因子就好;;


AC代码:


#include<stdio.h>
#include<math.h>
#define ll long long
int main() {
	ll n;
	ll cas = 1;
	ll res;
	while(scanf("%lld",&n) && n) {
		ll num = n;
		ll res = 0;
		ll flag = 0;
		for (ll i = 2 ; i <= sqrt(n) ; i++) {
			if(num % i == 0)
				flag++;
			ll k = 1;
			while(num % i == 0) {
				k *= i;
				num /= i;
			}
			if(k != 1)
				res += k;
		}
		if(num == n) {
			res = n + 1;
		}
		if(flag == 1 && num == 1) {
			res = n + 1;
		}
		if(num != n && num != 1) {
			res += num;
		}
		printf("Case %lld: %lld\n",cas++ , res);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值