N的阶乘——清华

题目描述

在这里插入图片描述

知识点

高精度整数与低精度整数的乘法

结果

在这里插入图片描述

实现

码前思考

  1. 虽然这是阶乘的问题,但是我们可以将其转换成高精度整数的乘法问题

代码实现

//高精度整数与低精度数的乘法 
#include "bits/stdc++.h"
using namespace std;

//估摸着位数的极限就是3000啦 
const int maxn = 3000;

struct bign{
	int d[maxn];
	int len;
	bign(){
		memset(d,0,sizeof(d));
		len = 0;
	} 
};

bign multi(bign a,int b){
	bign c;
	int carry = 0;
	for(int i=0;i<a.len;i++){
		int ans = b * a.d[i] + carry;
		carry = ans / 10;
		c.d[c.len++] = ans % 10;
	}
	
	while(carry != 0){
		c.d[c.len++] = carry % 10;
		carry = carry / 10;
	}
	return c;
}

int main(){
	int n;
	while(~(scanf("%d",&n))){
		if(n==0){
			return 1;
		}else{
			bign c;
			c.len = 1;
			c.d[0] = 1;
			 
			for(int i=n;i>=2;i--){
				c = multi(c,i);	
			}
			
			for(int i=c.len-1;i>=0;i--){
				printf("%d",c.d[i]);
			}	
		}

		
		printf("\n");
	} 
	return 0;
}

 

码后反思

  1. 注意要在multi()函数最后保留下进位,而且进位不一定是个位数,因此要循环!
发布了173 篇原创文章 · 获赞 3 · 访问量 5225

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105447972