【藍橋杯】基礎練習 階乘計算

問題描述

  輸入一個正整數n,輸出n!的值。
  其中n!=1*2*3*…*n

算法描述

  n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數aA[0]表示a的個位,A[1]表示a的十位,依次類推。
  將a乘以一個整數k變爲將數組A的每一個元素都乘以k,請注意處理相應的進位。
  首先將a設爲1,然後乘2,乘3,當乘到n時,即得到了n!的值。

輸入格式

  輸入包含一個正整數nn<=1000。

輸出格式

  輸出n!的準確值。

樣例輸入

10

樣例輸出

3628800

// jiechen.cpp : 定義控制檯應用程序的入口點。
//

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int a[1000];
	int n;
	cin >> n;
	memset(a,0,sizeof(a)); //初始化數組
	a[0] = 1;
	int sum = 0;
	for(int i = 2;i <= n;i++)
	{
		int c = 0;
		for(int j = 0;j < 1000;j++)
		{
			sum = a[j] * i +c;   
			c = sum / 1000;   //數組每一位可以存放3位數,那麼可算出的數的長度最長爲3*1000
			a[j] = sum % 1000;
		}
	}
	int i;
	for(i = 999;i >= 0;i--)
	{
		if(a[i] != 0)   //找到所求數的起點,也就是所求的結果的第一位的位置
		{
			break;
		}
	}
	for(int j = i;j >= 0;j--)
	{
	    if(a[j] < 10 && j != i)   //如果是第一位數,那麼是不需要前綴0的,如果是中間的數,那麼需要補齊前綴0    
	        cout <<0<<0;    
	    else if(a[j] < 100 && j != i)
	    {
	        cout << 0;
	    }
	    
		cout << a[j];
	}
	return 0;
}

補齊前綴0的細節講解:

假如:求4!時,數組a[1000]此時爲{24,0,...,0},那麼直接輸出24即可

求7!時,a[1000]此時爲{40,5,0,...,0},那麼40應該補齊3位(也就是加上一個前綴0),而5是第一個數(不加前綴0),所以結果爲5040。(如果不加前綴0,結果會變成540,錯誤!!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章