1. 程式人生 > >藍橋杯BASIC- 30 基礎練習 階乘計算

藍橋杯BASIC- 30 基礎練習 階乘計算

問題描述

  輸入一個正整數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

思路:也是用陣列模擬,詳解看程式碼吧

#include<stdio.h>
#include<string.h>
int a[300000];//確保陣列足夠大 
int main()
{
	int i,j,n,temp,d=1,carry;//temp為階乘元素與臨時結果的乘積,carry是進位 ,d是位數 
	scanf("%d",&n);//n的階乘 
	a[0]=1;//先初始化為1,方便後面運算 
	for(i=2;i<=n;i++)//從2開始階乘 ,每次迴圈計算i階乘的結果 
	{
		for(j=1,carry=0;j<=d;j++)// 每次迴圈初始化進位的值 
		{
			temp=a[j-1]*i+carry;//相應階乘中的一項與當前所得臨時結果的某位相乘加上進位 
			a[j-1]=temp%10;//更新臨時結果的位上資訊 
			carry=temp/10;//如果有進位就進入下面的迴圈 
		}
		while(carry)     //如果有進位 
		{   ++d;        //增加進位,位數加一
	                a[d-1]=carry%10;   //給新的進位賦值 
			carry=carry/10;    //看還可不可以再進位 
		}
	}
	//printf("n!=");
	for(j=d-1;j>=0;j--)       //從高位向低位依次輸出 
	printf("%d",a[j]);
	printf("\n");
	return 0;
 }