您的位置:首页 > 其它

hdoj-1042 N!

2015-08-05 16:07 387 查看
题目详见http://acm.hdu.edu.cn/showproblem.php?pid=1042
搜索


对于大数(比如1000的阶乘)我们找不到一个数据类型存放这个数

1.用数组模拟大数的运算。
2.开一个比较大的整型数组,数组的元素代表数组的某一位。
3.通过对数组元素的运算模拟大数的运算。
4.将数组输出(最后去掉前导0,即如果结果是342,那么就不能输出为0342)

code1:数的低位存在数组中的低位,输出时倒过来从数组高位到低位输出

//#include<cstdio>  
#include<iostream>//C++中标准输入输出流,没有iostream输出有错 
#include<cstring>
using namespace std;
const int maxn=36000;//10!约有35660位 
//数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
int a[maxn];
int main()
{
	int n,i,j,c,s;
	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));//数组的初始化  memset(a/*数组名*/,0/*要赋予的值*/ ,sizeof(a)/*数组元素个数*/) 
		a[0]=1;
		for(i=1;i<=n;i++)
		{
			c=0;
			for(j=0;j<maxn;j++)//数的低位存在数组中的低位 
			{
				s=a[j]*i+c;//逐位相乘得到的值(可能>=10) 
				a[j]=s%10;//考虑进位  第J位上的数 (数组中每个位置的值只能是一位数)
				c=s/10;// 向高位进位的值 
			}
		}
		for(j=maxn-1;j>=0;j--)//从高位向低位扫描 找到第一个不是零的数 (该for语句的循环体为空语句)
			if(a[j])  //for循环里的j一直自减直到a[j]!=0跳出for循环 
               break;  
        for(i=j;i>=0;i--)  
            printf("%d",a[i]);  
        printf("\n");  
	}
	return 0;
}

个人比较喜欢code2

code2:[b]数的低位存在数组中的高位,输出时直接从低位开始输出[/b]

//#include<cstdio>  
#include<iostream>//C++中标准输入输出流,没有iostream输出有错 
#include<cstring>
using namespace std;
const int maxn=36000;//10!约有35660位 
//数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
int a[maxn];
int main()
{
	int n,i,j,c,s;
	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));//数组的初始化 
for(i=1,a[maxn-1]=1;i<=n;i++)
		{
			c=0;
			for(j=maxn-1;j>=0;j--)//数的低位存在数组中的高位 
			{
				s=a[j]*i+c;
				a[j]=s%10;
				c=s/10;
			}
		}
		for(j=0;j<maxn;j++)
			if(a[j])
				break;
		for(i=j;i<maxn;i++)
			 printf("%d",a[i]);  
        printf("\n");  
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: