蓝桥杯 阶乘计算 C++基础练习 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  输入一个正整数n,输出n!的值。
  其中n!=123*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800

解题思路:
该题的思路与上一题高阶加法差不多,都是还原算数最原始的样子:按位运算并进位,这次 我参考了一位大佬的算法,比我之前的一位一位存储要高明得多,这次是一次存储四位,如有进位在数祖下一位进位,代码的注释很详细,需要注意输出的时候要进行判断,除了最高位的数组位不一定为4位,其他位数都是要4位。Ok,这便是基础练习的最后一题,让我们来看看代码吧!

#include <bits/stdc++.h>
using namespace std;
#define N 10000
int main()
{
	int a[N] = {1};			// 一个数组A来表示一个大整数a,将a设为1,方便进行运算 
	int k = 0, l = 1, n;			 //k表示进位的数字,l表示数组元素个数(位数),n表示要计算的阶乘 
	int i, j;
	cin >> n;
	for(i = 1;i <= n; i++)		//阶乘(不用递归可能怕消耗太大) 
	{
		for(j = 0; j < l; j++)	//数组A的每一个元素都乘以一个整数(正常的按位乘法) 
		{
			a[j] = a[j] * i + k;	//乘法计算,乘以i,类似算术里的竖式计算(加上上一位进位的数字) 
			k = a[j] / 10000;	//每位存 10000 以内的数,否则进位
			a[j] = a[j] % 10000;//保留余数 
		}
		if(k > 0)				//最后一位进位的处理 
		{
			a[j] = k;			//把进位的数字存放在下一个数组元素中 (进位) 
			l ++;			//数组长度加1 (增加一位) 
			k = 0;			//重置k (进位完成) 
		}
	}
	cout << a[l - 1];	//先输出最大位的数字(最大位可能不够4个数字) 如320输出一定还是320 
	for(i = l-2; i >= 0; i --)	{//再输出之后位的数字 (一定每位有4个数字) 
		if (a[i] / 1000 == 0 && a[i] /100 > 0) {
			cout << "0" << a[i];
		} 
		else if (a[i] / 100 == 0 && a[i] /10 > 0) {
			cout << "00" << a[i];
		}
		else if (a[i] / 10 == 0 && a[i] >= 0) {
			cout << "000" << a[i];
		}
		else cout << setw(4) << a[i];//输出4位数字,空位用0补充。比如320输出为0320 
	}
	return 0;
}

这是参考的代码地址: https://blog.csdn.net/qq_40977710/article/details/80499140

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/105722777
今日推荐