最小公倍数和数论——UVa10791-Minimum Sum LCM

大致题意

给定一个1e10以内的正整数a,试着求初出这样一串数列,它们的最小公倍数为a,输出这个数列元素和的最小值(元素数量至少为2)。

解题思路

很明显最终答案的元素中,任意两个元素的最大公约数都要是1,否则肯定存在另一个和更加小的数列,所以当我们把a分解成多个质数相乘时,必须要把相同的数乘在一起合并为一个数,另外还要处理一些特殊情况比如a=1,a为质数等等。

AC代码

#include<iostream>
#define ll long long
using namespace std;
int main() {
	ll int a,ans1,ans2,b=1,i,N,pan;
	while(1) {
		scanf("%lld",&a);
		ans1=0; ans2; pan;
		N=a;
		if(a==0) break;
		for(i=2;i<=a;i++) {
			pan=0;
			for(;i*i<a;i++) {
				if(a%i==0) {
					pan=1;
					break;
				}
			}
			if(pan==1) {
				a=a/i;
				ans2=i;
				for(;;) {
					if(a%i==0&&a>=2) {
						a=a/i;
						ans2=ans2*i;
					}
					if(a%i!=0||a<2) break;
				}
				ans1=ans1+ans2;
			}
			else {
				ans1+=a;
				break;
			}
		}
		if(ans1==N) ans1++;
		if(N==1) ans1=2;
		printf("Case %d: %lld\n",b++,ans1);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值