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");

}

  

posted @ 2012-05-22 10:01  不错的了  阅读(1205)  评论(2)    收藏  举报