這道題目把我難住了,用普通的演算法通不過。查了資料才知道,這道題目屬於大數相乘的問題。
思路和大整數的加法類似,利用乘法的原理解題,用整數陣列來解決大數的儲存問題。(因為用整型型別來儲存大數會發生溢位。)
所謂的乘法原理:是指兩個數相乘,其結果等於乙個數與另乙個數的每一位上的數字相乘後所得到的數字之和。跟我們筆算兩個數的乘法是一樣的。
例如:125*12 = 5*12+20*12+100*12=1500
網上有很多這道題目的**,但都是低位儲存個位的數(也就是說,陣列的儲存結果跟實際得到的數字順序上是恰恰相反的,如a[0]儲存的是個位的數。),理解起來很費勁。我終於找到了乙個按正常順序儲存的。**如下,有詳細的注釋:
#include#include#include#define max 10000
#define base 10000 //這裡寫10,100,1000,10000,1000000都可以,只是要注意輸出格式
int h[max];
int main()
for(j=0;j根據上面的原理,我寫了乙個大數(用陣列儲存)與數(用int儲存)的函式:
void multiply(int bignum, int biglen, int smallnum)
}
上面函式中,用的是十進位制,便於輸出。
完整的例子如下:
#include#include#includevoid multiply(int bignum, int biglen, int smallnum)
}int main()
; int b=34;
multiply(a,10,b);
for(i=0;i<10 && a[i]==0; ++i)
;for(;i<10;i++)
printf("%d", a[i]);
return 0;
}
HDOJ1042 大數 小數
題目很簡單,就是輸入乙個n,求n的階乘。這個題目是乙個大數乘小數的問題,例如n n 1 n,這裡,n 1 為大數,表示為字串的形式,n為小數,表示為int的形式。這道題的重點就是寫乙個函式實現乙個大數乘小數。一開始我的做法是大數和小數全部作為字串處理,類似於小學時的基本的豎式乘法來計算,這樣的話時間...
hdu1042(大數乘法 )
計算n!1 n 10000 在去南昌icpc邀請賽之前,勳宇帶著我們做過大數的題,剛好也是這個題。而我影響最深刻的就是運用到萬進製,顧名思義,以一萬為進製,因為n!是個很大的數,所以只能用陣列去存。需要注意的是列印時,倒敘且 04d,不足的用零去補。附上 include include void f...
HDU 1042 N 大數乘法 C語言
這是一道簡單的數學題,求乙個數 n 的階乘。但是問題是題中n給的非常大 0 n 10000 用for迴圈來做顯然不行了。1.開闢乙個夠大的陣列,保證大於1000!所佔的位數,我是以最大情況來估算,即1000個1000相乘,開一百萬吧,反正我們老大 miyu 說了陣列空間爛便宜。2.然後就是挨個來乘了...