经典爆破:
#include <stdio.h>
int main(){
for(int i=20;i>0;i++){
for(int j=1;j<=20;j++){
if(i%j!=0)
break;
if(j==20)
{
printf("最小公倍数为:%d",i);
return 0;
}
}
}
}
将1~20之间的所有数分解为ab * cd *···(分解质因数)然后将这些数乘起来 我们可以得到:
1 * 2 * 3* 2^2 * 5 * 2*3 * 7 * 2^3 * 3^2 * 2*5 * 11 * 2^2*3 * 13 * 2*7 * 3*5 * 2^4 * 17 * 2*3^2 * 19 * 2^2*5
由于要求的数能被1~20中的任意一个整除 所以此时我们的目标变成了求能被上面算式中的任意一项整除的数中最小的
由于只要一个数能被ab整除就能被ac整除(b>c) 所以对于上面的算式相同底数的任意两项 我们只需要保留指数较大的一项 指数和底数都相同的两项只需保留一项 (去重) 得到的算式为
1 * 5 * 7 * 11 * 13 * 2^4 * 17 * 3^2 *19
我们此时仍然要求能被上面算式中的任意一项整除的数中最小的 此时答案即为算式结果
本题的求解方法其实就是短除法求最大公因数与最小公倍数(全部相乘版)
#include <stdio.h>
int main() {
int primes[8] = {2, 3, 5, 7, 11, 13, 17, 19}; // 所有出现在质因数分解中的质数
int factors[8] = {4, 2, 1, 1, 1, 1, 1, 1}; // 对应质数的最大幂次
long long ans = 1; // 答案初始化为1
for (int i = 0; i < 8; i++) {
// 计算所有质数的最大幂次
for (int j = 20; j > 1; j--) {
int count = 0;
int x = j;
while (x % primes[i] == 0) {
//分解质因数的过程,从1到20看能分解2,3,4...等质因数的幂数用count来记录
count++;
x /= primes[i];
}
if (count > factors[i]) {
factors[i] = count;//出现与预测的最高幂次有出入的将其更新
}
}
// 根据每个质数的最大幂次计算答案
for (int j = 0; j < factors[i]; j++) {
ans *= primes[i];
}
}
printf("%lld\n", ans); // 输出答案
return 0;
}
该代码先定义了两个数组primes
和factors
,分别表示所有出现在质因数分解中的质数和对应质数的最大幂次。然后使用两个循环分别计算所有质数的最大幂次,并根据每个质数的最大幂次计算答案。最后输出答案即可。
需要注意的是,由于题目要求的结果非常大,因此使用long long
类型来存储答案。同时,为了避免溢出,我们在循环中应该先进行除法运算再进行乘法运算,即将代码中的ans *= primes[i]
改为ans /= (primes[i] / factors[i])
。