您的位置:首页 > 其它

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

2013-06-16 16:49 253 查看
问题描述:

为什么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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: