高精度正整數除法 大整數除法

2021-08-15 02:43:04 字數 2059 閱讀 3535

標籤(空格分隔): 演算法競賽 演算法 程式設計錯題 高精度

單詞:

divident:被除數

divisor:除數

quotient:商

大整數除法 openj_bailian - 2737

題目要求:求兩個大的正整數相除的商。

input:第1行是被除數,第2行是除數。每個數均不超過100位。

output:一行,相應的商的整數部分

sample input:

2376

24sample output:

99

演算法是這樣的,我們以減法代替除法,計算能夠減多少次。既然這樣,第乙個思路就是模擬減法了。但是做的時候發現,模擬減法慢的出奇,需要呼叫陣列很多次,七位數除以一位數時時間就到1秒了。所以必須換思路。

第二種思路的時間複雜度是小的多的,但是思考起來很難,實現起來更加的難。

除法的模擬法是這樣的:

計算被除數與除數相差的位數t

計算dividend-divisor*10^t

重複計算2,直到結果小於0時,記錄計算次數j,j*10^t作為商的一部分,計算j=j+j*10^t(初始j為0)。將t-1,繼續計算2

不斷重複上述過程,每次的j[k++]迴圈相加,直到t=0,此時的j即為商。

實現起來很麻煩的。**如下

#include 

#include

#define n 101

int dd[n],ds[n],qu[n];

char str1[n],str2[n];

intsub(int* dd,int* ds,int len1,int len2) //這個函式是重點難點

for (i=0;iif (dd[i]<0)

}for (i=len1-1;i>=0;i--)

if (dd[i]) break;

return i+1;

}int main()

else

if (len1==0)

qu[0]=1;

inttimes=len1-len2;

for (i=len1-1;i>=0;i--) //從這一行到72行是重點難點!

len2=len1;

for (j=0;j<=times;j++)

}for (i=0;iif (qu[i]>9)

}for (i=n-1;qu[i]==0&&i>=0;i--);

while (i>=0)

printf("%d",qu[i--]);

printf("\n");

return

0;}

先定義了sub函式,判斷輸入的高精度被除數和除數的大小關係,被除數小與除數,則返回-1,否則,計算被除數減除數,將結果賦給被除數,再計算被除數此時的位數,返回位數。

對於main函式,先是老套路,用字串陣列儲存輸入的高精度數,計算位數,之後用整型陣列逆序存放每一位,之後執行一次sub,判斷、排除被除數小於等於除數的情況。

由於已進行了一次減法,所以商(同樣按位數逆序儲存)要先+1。

之後line56~line72,就是重點和難點了。

先是line56~line62,是在模擬乘10的冪次運算。由於資料儲存在陣列中,所以直接向後移位即可。注意他的移位方法,這是最省時間的移位方法,比我原先的移位方法快的多

然後是更難的line63~line72。這一部分是同時在做減法和累加商。迴圈的計數器j,還是模擬10的冪次相乘的控制器和對商加和的控制器,ds+j控制除數陣列的位數,也就相當於控制了乘10的次數;len-j控制了除數陣列的長度,和ds-j結合起來,被sub()呼叫,就控制了演算法中的2。之後,首先定義了tmp中間變數,判斷每次運算之後被除數是否還大於等於除數,如果小於,就結束迴圈。每次計算後,將tmp賦值給len1,實現迴圈呼叫,並且將對應的商的位數(由高位加到低位,符合我們設定的規律)+1。這裡尤其要注意思考,qu[times-j]++,這一步是如何通過迴圈來計算商的。

剩下的**還是老套路,就不解釋了。

高精度正整數除法 大整數除法

標籤 空格分隔 演算法競賽 演算法 程式設計錯題 高精度 單詞 divident 被除數 divisor 除數 quotient 商大整數除法 openj bailian 2737 題目要求 求兩個大的正整數相除的商。input 第1行是被除數,第2行是除數。每個數均不超過100位。output 一...

大整數除法

define maxint 1000 define max 200 int num1 max 10 int num2 max 10 unsigned int total max 10 int sub int a,int b int i 0 for a b i return i cstring big...

高精度除法 大數除法

問題描述 給出兩個正整數,計算a b的值,保證a和b的位數不超過500位。輸入描述 輸入兩個用空格隔開的正整數。輸出描述 輸出a b的值。樣例輸入 500 2 樣例輸出 250 解題思路 大數除法的實現有兩種方式 1 用a b,迴圈,直到a 計算過程 擴充套件b的位數 a.length b.lent...