[紫书CH10] 例题10-4:最小公倍数的最小和(唯一分解定理、大素数、UVa10791)

本文针对《算法竞赛入门经典》第二版中UVA10791题目进行解析,采用唯一分解定理结合大素数策略,解决最小和倍数问题。讨论了素数、整数次方等特殊情况,并分享了使用C++实现的代码。

紫书题解汇总:[紫书CH0] 《算法竞赛入门经典》(第2版) 题解目录

1. 题目来源

链接:UVA10791 Minimum Sum LCM

2. 题目说明

在这里插入图片描述
中文描述:

在这里插入图片描述

3. 题目解析

方法一:唯一分解定理+大素数

题意也是很明确了,很容易能想到这是唯一分解定理,因为这样分解都是素数的幂积,不会产生两两直接存在约数的情况,也就符合题目要求。
题目坑点蛮多的,至少两个整数意味着若该数为素数、为 1、为整数次方时即唯一分解仅有 1 个因子的情况下,就需要加上一个挂件数 1,最后结果也得加 1。

还有个坑点 n=2^31 −1 时,输出的数为 2147483648 这是个素数,加 1 后超出了 int 的存储范围,最好用 long long 存储。这个属实没发现…被恶心到了嗷。

来自百度百科,再膜一下祖师爷:
在这里插入图片描述

参见代码如下:

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

// 质因子分解
int divide_all(int& n, int d) {
	int x = 1;
	while (n % d == 0) { 
		n /= d; 
		x *= d; 
	}
	return x;
}

long long solve(int n) {
	if (n == 1) return 2;
	// floor向下取整,+0.5即四舍五入扩大精度
	int m = floor(sqrt(n) + 0.5);
	long long ans = 0, cnt = 0;		// cnt素数个数,ans答案最小和
	for (int i = 2; i < m; ++i) {
		if (n % i == 0) {			// 新的素因子
			++cnt;
			cout << i << endl;
			ans += divide_all(n, i);
		}
	}
	if (n > 1) ++cnt, ans += n;
	if (cnt <= 1) ++ans;
	return ans;
}


int main() {
	int n, tmp = 0;
	while (cin >> n and n) 
		cout << "Case " << ++tmp << ": " << solve(n) << "\n";
	return 0;
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值