题目1076:N的阶乘
时间限制:3 秒
内存限制:128 兆
特殊判题:否
提交:8864
解决:3310
-
题目描述:
-
输入一个正整数N,输出N的阶乘。
-
输入:
-
正整数N(0<=N<=1000)
-
输出:
-
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
-
样例输入:
-
4 5 15
-
样例输出:
-
24 120 1307674368000
-
来源:
- 2006年清华大学计算机研究生机试真题
-
//N的阶乘--由于之后乘出来的数据很大,所以还是要用到高精度整数运算 //高精度整数乘法 //那么问题来了,如何实现大数与小数的乘法呢? //是直接相乘,还是像手算一样乘呢?#include <cstdio>struct bigInteger{int digit[1000];int size;void init(){for(int i=0;i<1000;i++)digit[i]=0;size=0;}void set(){init();size=1;digit[0]=1;}void output(){for(int i=size-1;i>=0;i--){if(i==(size-1))printf("%d",digit[i]);else printf("%04d",digit[i]);}printf("\n");}bigInteger operator*(const int& x)const{bigInteger ret;ret.init();int carry=0;printf("1size :%d\n",size);for(int i=0;i<size;i++){int temp=x*digit[i]+carry;ret.digit[ret.size]=temp%10000;carry=temp/10000;(ret.size)++;printf("2size :%d\n",size);}if(carry!=0){ret.digit[(ret.size)++]=carry;}printf("3size :%d\n",size);return ret;}bigInteger minusBigIn(const bigInteger &A,const int x)const{bigInteger ret;ret.init();int carry=0;//printf("1size :%d\n",A.size);for(int i=0;i<A.size;i++){int temp=x*digit[i]+carry;ret.digit[ret.size]=temp%10000;carry=temp/10000;(ret.size)++;//printf("2size :%d\n",A.size);}if(carry!=0){ret.digit[(ret.size)++]=carry;}//printf("3size :%d\n",A.size);return ret;} };struct bigInteger a; int main(){int n;while(scanf("%d",&n)!=EOF){a.set();for(int i=1;i<=n;i++){//a=a*i;a=a.minusBigIn(a,i);}a.output();//printf("\n a.size : %d\n",a.size);}return 0; }
都是板子题。记得init() 里面循环置零,size置零。 set()里面按照题意设置高精度整数的值。