蓝桥杯 求自然数序列的最小公倍数

8 篇文章 0 订阅
2 篇文章 0 订阅

问题描述:

为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。我们希望寻找到能除尽1至n的的每个数字的最小整数。不要小看这个数字,它可能十分大,比如n=100, 则该数为:69720375229712477164533808935312303556800

请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。

例如:
用户输入:
6
程序输出:
60

用户输入:
10
程序输出:
2520


#include <iostream>
using namespace std;

char res[1000];
int isPrime[1000];

int solve(int n);

int main()
{
    int n;
    cin>>n;
    int t = solve(n);
    for(int i=t; i>=0; i--)
        cout<<(int)res[i];
    cout<<endl;
    return 0;
}

int solve(int n)
{
    for(int i=0; i<=n; i++)
        isPrime[i] = 1;
    isPrime[0] = isPrime[1] = 0;

    int p = 0;
    res[p++] = 1;

    for(int i=2; i<=n; i++)
    {
        if(isPrime[i])
        {
            for(int j=i+1; j<=n; j++)
                if(j%i==0)
                    isPrime[j] = 0;

            //求小于该数的质数的指数值,即t=2^n,求小于n的最大的t
            //如n=6时,2为4,3为3, 5为5
            //所以结果为4*3*5=60
            int tmp = i;
            while(tmp<=n) tmp*=i;
            tmp /= i;

            int o = 0;
            for(int s=0; s<p; s++)
            {
                int t = res[s] * tmp + o;
                o = t /10;
                res[s] = t%10;
            }
            while(o>0)
            {
                res[p++] = o%10;
                o /= 10;
            }
        }
    }
    return p-1;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值