这是2011北大设计大赛的第一道编程题。
自己做的时候,一看就做的涉及大整数问题,故采用了数组。然而没学过采用素数分解法,最后做出的结果是当输出20时,就要等半天才出结果。
后来在网上看到这方法,自己又重新写了一遍,除了98,99很慢以后,1~97都不会超过1秒钟了!!
素数分解法:
当n=60时,有
逐个素数确定其指数:
2:在[m,n]范围内,2
1有倍数,2
2有倍数, 2
3有倍数,…, 2
5有倍数,2
6无倍数。确定2指数为5,幂32;
3:在[m,n]范围内,3
1有倍数,3
2有倍数, 3
3有倍数, 3
4无倍数。确定3指数为3,幂27;
5:在[m,n]范围内,5
1有倍数,5
2有倍数, 5
3无倍数。确定5指数为2,幂25
............
最后将这些素数幂的指数相乘。
//输入整数n,求1~n(1<n<100)的最小公倍数。
//例如 输入 :6 输出 60 输入:10 输出 2520 输入:100 输出41位整数
//思路:该题是求n个数的最小公倍数,由题目可知,可定涉及到大整数问题,故用数组来存储大整数。
//在总数较多的情况下,求(m,m+1,m+2,...,n)的最小公倍数。推荐
/*素数分解法:
使用小于等于n的素数表,逐个素数确定指数。
比如2,2的指数根据[m,n]范围内的最大2的幂来定。然后3、5。
如果某素数在[m,n]范围内没有幂,则判断该素数在[m,n]范围内有无倍数,有指数为1,无为0。
最后把素数按照其指数乘幂,再相乘。
*/
#include<stdio.h>
#includ