清华大学考研复试机试:N的阶乘2

版权声明:本文为博主原创,未经博主允许不得转载。转载请附上原文链接。 https://blog.csdn.net/qq_38341682/article/details/88604184

题目描述

输入一个正整数N,输出N的阶乘。

输入描述

正整数N(0<=N<=1000)

输出描述

输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

分析

大数运算,肯定爆long long int,不能暴力求解。5000的阶乘位数是16326位,所以开个20000位的数组肯定能够存下结果。一般这种大数运算都是模拟手工运算的过程,这道题比较好的是N是一个int以内的数。所以只需要模拟一个大数与一个int数相乘即可,比需要模拟两个大数相乘要简单许多。因此在模拟乘法时,以int数作为被乘数,这样不用模拟两个数都一位一位的乘,只需要将用来存结果的数按位相乘即可。

在具体实现时可以使用一个下标来记录当前位数,计算过程中要注意最高位的进位,输出结果时也要从最高位开始输出。

AC代码如下:

#include<iostream>

using namespace std;

int main(void)
{
	int n;
	while(cin >> n)
	{
		int result[20001] = {0};//结果
		result[0] = 1;//初始化
		int index = 1;//记录最高位的后一位下标
		for(int i = 2; i <= n; ++i)//阶乘
		{
			int temp = 0;//用于进位
			//按位相乘,可以将这当作一个模板,很多大数运算都可以按照这种思路来做
			for(int j = 0; j < index; ++j)
			{
				temp += result[j] * i;
				result[j] = temp % 10;
				temp /= 10;
			}
			while(temp)//判断最高位有没有进位
			{
				result[index++] = temp % 10;
				temp /= 10;
			}
		}
		for(int i = index-1; i >= 0; --i)//输出结果
		{
			cout << result[i];
		}
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38341682/article/details/88604184