題目很簡單,就是輸入乙個n,求n的階乘。
這個題目是乙個大數乘小數的問題,例如n! =(n-1)! * n,這裡,(n-1)!為大數,表示為字串的形式,n為小數,表示為int的形式。這道題的重點就是寫乙個函式實現乙個大數乘小數。
一開始我的做法是大數和小數全部作為字串處理,類似於小學時的基本的豎式乘法來計算,這樣的話時間複雜度會非常高,設大數有x位數字,小數有y位數,需要有xy次訪問,並且每次還需要進行一次大數加法運算,時間複雜度實在太高,**提交上去肯定會超時的。
大數×小數的基本思想是:我們小學時候的乘法豎式運算將每個數都一位一位的進行乘法運算,這裡我們將小數看成乙個整體。例如7231(大數,表示為字串)×39(小數),設定乙個變數carry表示進製。result字串表示結果,初始化為空串
carry=0,遍歷大數的每一位:
1×39+carry=39 carry=39/10=3 39%10=9,result='9'+result=9
3×39+carry=120 carry=120/10=12 120%10=0 result='0'+result=09
2×39+carry=90 carry=9 result=009
7×39+carry=282 carry=28 result=2009
此時大數的每一位遍歷完成,carry=28,result="28"+result=282009得到結果。
附上hdoj1042的**,bigint類封裝了大整數
#include#includeusing namespace std;
//#define debug
void calfactorial(int n);
string inttostring(int a);
class bigint
bigint(int value)
void operator*=(int& b);
void print()
cout<} void setnum(int value)
} static const int numsize=100000;
private:
char num[numsize];
int start;//start為起始數字下標
int end;//(end-1)為最後乙個數字下標
};void bigint::operator*=(int& b)
bigint_p++;
//cout<<"carry="
start=bigint_p;
}int n;
int main()
}void calfactorial(int n)
result.print();
}
大數乘法 HDOJ1042
這道題目把我難住了,用普通的演算法通不過。查了資料才知道,這道題目屬於大數相乘的問題。思路和大整數的加法類似,利用乘法的原理解題,用整數陣列來解決大數的儲存問題。因為用整型型別來儲存大數會發生溢位。所謂的乘法原理 是指兩個數相乘,其結果等於乙個數與另乙個數的每一位上的數字相乘後所得到的數字之和。跟我...
hdu1042(大數乘法 )
計算n!1 n 10000 在去南昌icpc邀請賽之前,勳宇帶著我們做過大數的題,剛好也是這個題。而我影響最深刻的就是運用到萬進製,顧名思義,以一萬為進製,因為n!是個很大的數,所以只能用陣列去存。需要注意的是列印時,倒敘且 04d,不足的用零去補。附上 include include void f...
杭電ACM 1042 大數階乘 N
原題位址 首先定義乙個足夠長的陣列。拿10000的階乘為例,最後的結果長度是35660位,所以我們定義乙個40000個成員的陣列就可以了。int result 40000 其核心思想就是把計算結果每一位上的數字儲存到乙個陣列成員中,例如 把124儲存至陣列中,儲存結果應該是 result 0 4 r...