1. 程式人生 > >用陣列解決數值大的數的階乘!!

用陣列解決數值大的數的階乘!!

起初這是C++老師,佈置的道題,做了3天  也沒做出來,最後還是聽別人的意見改的,原因是自己的想法太複雜了 ,而且 乘法還是沒學好,沒用過這樣的乘法,也不知道,

自己太菜雞了!!!

廢話不多說了,開始吧

題目:解決高位數的階乘問題,例如50的階乘

分析:無論是用int 還是long long 最終結果還是會越界,導致輸出異常。;

直接丟程式碼

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <string.h>
#include <cmath>
using namespace std;
int a[1001];
int solo(int a[])
{
    int j;
	for(int i=1000;i>=0;i--)
	{
		if(a[i]!=0)
		{
			 j=1000-i+1;
			break;
		}
	}
	return j;
}
int main()
{
    memset(a,0,sizeof(a));
    int n;
    a[0]=1;
    cin>>n;
    if(n==0)
    {
        cout<<1<<endl;
        return 0;
    }
    if(n==1)
    {
        cout<<1<<endl;
        return 0;
    }
    for(int i=2; i<=n; i++)
    {
        int sum=0;
        int Q=0;
        int zz=solo(a);
        while(1)
        {
            int z=i*a[Q]+sum;
            int t=0;
            if(z>=10)
            {
                a[Q]=z%10;
                sum=z/10;
            }
            else
            {
                a[Q]=z;
                sum=0;
            }
            Q++;
            if(Q>=zz&&t==0)
					break;
        }

    }
    int zzz;
    for(int i=1000;i>=0;i--)
    {
        if(a[i]!=0)
        {
            zzz=i;
            break;
        }
    }
    for(int i=zzz;i>=0;i--)
        cout<<a[i];
}

忘記在程式碼上加註釋了!!   唉 壞毛病

呼叫的solo函式:

舉例:

在10的階乘裡面,算11的階乘的時候,10的階乘是個很大的數,最裡層的那個while迴圈  需要確定一下迴圈幾次,solo函式就是確定次數的,他通過讀取已有的a陣列中元素最後一位的座標,來確定到底佔用了多少個數組記憶體了,從而確定 i 值乘多少遍。

其餘的沒什麼好解釋的了    垃圾演算法  歡迎交流Q:690217293