[高精度整数] N的阶乘 [2006年清华大学计算机研究生机试真题]

题目描述:
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入:
4
5
15
样例输出:
24
120
1307674368000

解题思路: 从低位往高位相乘,并加上来自低位的进位,采用重载乘法运算符定义乘法。

#include<bits/stdc++.h>
using namespace std; 

struct bigInteger{
	int digit[1000];
	int size;
	void init(){//初始化 
		for(int i=0; i<1000; i++) digit[i] = 0;
		size = 0;
	}
	void set(int x){//用一个小整数设置高精度整数 
		init();
		do{//对小整数4位为一个单位分解依次存入digit当中 
			digit[size++] = x%10000;
			x /= 10000; 
		}while(x!=0);
	}
	void output(){//输出 
		for(int i=size-1; i>=0; i--){
			if(i!=size-1) printf("%04d", digit[i]);
			else printf("%d", digit[i]);
		}
		cout << endl;
	}
	bigInteger operator * (int x) const{//乘法运算符重载 
		bigInteger ret;//将要返回的高精度整数 
		ret.init();//初始化 
		int carry = 0;//进位初始值为0 
		for(int i=0; i<size; i++){
			int tmp = x * digit[i] + carry;//用小整数x乘当前位数字并加上来自低位的进位 
			carry = tmp/10000;//计算进位 
			tmp %= 10000;//去除进位部分 
			ret.digit[ret.size++] = tmp;//保存该位数字
		}
		if(carry!=0){//若最高位有进位 
			ret.digit[ret.size++] = carry;//保存该进位 
		}
		return ret;//返回结果 
	}
}a;

int main(){
	int n;
	while(scanf("%d", &n)!=EOF){
		a.init();//初始化a 
		a.set(1);//a初始值为1 
		for(int i=1; i<=n; i++){
			a = a*i;//依次乘上每一个整数 
		}
		a.output();//输出a 
	}
	return 0;
}

本题在线测试入口

结束


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值