您的位置:首页 > 编程语言 > C语言/C++

HDU-1042 N! 大数乘法 (C语言)

2011-03-29 19:01 288 查看
这是一道简单的数学题,求一个数(N)的阶乘。但是问题是题中N给的非常大(0<=N<=10000),用for循环来做显然不行了。这里用数组来对付这些大家伙。基本思路如下:

  1.开辟一个够大的数组,保证大于1000!所占的位数,我是以最大情况来估算,即1000个1000相乘,开一百万吧,反正我们老大(Miyu)说了数组空间烂便宜。

  2.然后就是挨个来乘了(说白了,就是模拟我们平时的乘法),这里不要惯性的只要看见某位过10便想着进位,虽然这样能做,但艰难。可以让一位存大一点的数值,要知道,对于每一位来说,可以存下一个21亿的数字。

  3.如果只是乘,不中途处理一次进位的话,那便永远是在“个位”做乘法了,肯定不行,于是我们每乘2次处理一次进位(理由见代码注释),这样变可解决这个问题了。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAX 1000000
int N,p,res[MAX+1];

int main()
{
while(scanf("%d",&N)!=EOF)
{
p=MAX;                      //定义P为最高位指针.
memset(res,0,sizeof(res));  //初始化数组
res[MAX]=1;                 //由于是乘法,初始化为 1 ,这样0!也就为 1 了
for(int i=2;i<=N;++i)
{
p-=4;                   //由于 Lvsi 同志觉得做题目应不止满足于做出
for(int j=MAX;j>=p;--j) //所以改进了一下,由 [MAX->0] 改为每次乘后
res[j]*=i;    //开辟四位进位空间,根据乘以最大数10000而来.

if(i%2==0||i==N)	//让它乘两次处理一次进位,即把每位更新成9以下
{			   //如果%3的话想想连乘 998 999 1000 之类的肯定,溢出了.
for(int j=MAX;j>=p;--j) //最后进位是必须的
{
int c=res[j]/10;
res[j]%=10;
res[j-1]+=c;
}
}
}

for(int i=0;i<=MAX;++i)  //清除前置的零.
{
if(res[i]!=0)
{
p=i;
break;
}
}
for(int i=p;i<=MAX;++i)
printf("%d",res[i]);
puts("");
}
//system("pause");
return 0;
}


  提交用了875MS,努力努力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: