【c++】求1-n的最小公倍数

要求实现

输入一个n (1 <= n <= 10000)
求能整除1-n的最小正整数,即最小公倍数
由于数可能比较大,输出结果mod987654321
eg.
输入:3
输出:6 (6是能整除1,2,3的最小正整数)

Hint:
我们知道两个数a,b的最小公倍数是 a b g c d ( a , b ) ,但是由于这里求1到n的最小公倍数,采用这个方法的话,a*b将超出int的表示范围,导致溢出。

因此,我们考虑类似短除的做法,对1-n的每一个数进行分解质因数的方法求解。找出每个质数的最大次幂,相乘即可得最小公倍数。

#include <iostream>
#include <math.h>
using namespace std;

#define MOD 987654321
#define MAX 10001

/*
这个程序实现
输入一个n
求能整除1-n的最小正整数,即最小公倍数
由于数可能比较大,输出结果mod987654321 
eg.
输入:3
输出:6 (6是能整除1,2,3的最小正整数)

*/ 


int main() {
    bool prime[MAX];

    //找出1-10000的质数
    for (int i = 0; i < MAX; i++) {
        prime[i] = true;
    }
    for (int i = 2; i < MAX; i++) {
        if (!prime[i]) continue;
        for (int j = i+1; j < MAX; j++) {
            if (j%i == 0) prime[j] = false;
        }
    }
    int n;
    cin >> n;

    //分解质因数,找出最大对应最大幂
    int mi[MAX];
    for (int i = 0; i <= n; i++) {
        mi[i] = 0;
    }
    int count = 0;
    for (int i = 2; i <= n; i++) {
        int k = i;
        for (int j = 2; j <= n; j++) {
            if (!prime[j]) continue;
            count = 0;
            while (k%j == 0) {
                k = k/j;
                count++;
            }
            if (count > mi[j]) mi[j] = count;
            if (k == 0) break;
        }
    }

    //每个质数最大幂相乘,即为最小公倍数
    int ans = 1;
    for (int i = 2; i <= n; i++) {
        if (!prime[i]) continue;
        for (int j = 0; j < mi[i]; j++) {
            ans = (ans*i)%MOD;
        }
    }
    cout << ans << endl;
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/ulricalin/article/details/79873744