problem 5

经典爆破:

#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;
}

该代码先定义了两个数组primesfactors,分别表示所有出现在质因数分解中的质数和对应质数的最大幂次。然后使用两个循环分别计算所有质数的最大幂次,并根据每个质数的最大幂次计算答案。最后输出答案即可。

需要注意的是,由于题目要求的结果非常大,因此使用long long类型来存储答案。同时,为了避免溢出,我们在循环中应该先进行除法运算再进行乘法运算,即将代码中的ans *= primes[i]改为ans /= (primes[i] / factors[i])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值