当前位置: 代码迷 >> 综合 >> 题目1076:N的阶乘 九度OJ
  详细解决方案

题目1076:N的阶乘 九度OJ

热度:23   发布时间:2023-09-24 06:33:21.0
题目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()里面按照题意设置高精度整数的值。