100以内N的阶乘(2011蓝桥杯决赛本科第三题C/C++)
为什么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
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
/*
请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。*/
#include <math.h>
#include <stdio.h>
void main()
{
int i,j,k,n,s[3][45]={0},m[30]={2,0},x=1;
scanf("%d",&n);
for(i=3;i<=n;i+=2)
{
for(j=2;j<i/2;j++)
if(i%j==0) break;
if(j>=i/2)
{
m[x]=i;
x++;
}
}
k=m[0];
while(k<=n) k*=m[0];
k/=m[0];
s[0][0]=k%10;
s[0][1]=k/10;
for(i=1;i<x;i++)
{
k=m[i];
while(k<=n) k*=m[i];
k/=m[i];
for(j=0;j<45;j++)
s[1][j]=s[0][j]*(k%10);
for(j=0;j<44;j++)
{
s[1][j+1]+=s[1][j]/10;
s[1][j]%=10;
}
for(j=1;j<45;j++)
s[2][j]=s[0][j-1]*(k/10);
for(j=1;j<44;j++)
{
s[2][j+1]+=s[2][j]/10;
s[2][j]%=10;
}
for(j=0;j<45;j++)
s[0][j]=s[1][j]+s[2][j];
for(j=0;j<44;j++)
{
s[0][j+1]+=s[0][j]/10;
s[0][j]%=10;
}
}
for(i=44;i>=0;i--)
{
if(s[0][i]!=0) break;
}
for(j=i;j>=0;j--)
printf("%d",s[0][j]);
printf("\n");
}
浙公网安备 33010602011771号