高精度除法 大數除法

2021-07-08 17:19:27 字數 1539 閱讀 9483

[問題描述]

給出兩個正整數,計算a÷b的值,保證a和b的位數不超過500位。

輸入描述

輸入兩個用空格隔開的正整數。

輸出描述

輸出a÷b的值。

樣例輸入

500 2

樣例輸出

250

[解題思路]

大數除法的實現有兩種方式:

1:用a-=b,迴圈,直到a

計算過程:

擴充套件b的位數(a.length()-b.lenth()=3;) b=;

①此時a-b>0 故:

a=a-b=  ans=;

此時a-b<0 b退一位 取b=;

此時仍是a-b<0 b再退一位  取b= ;

②此時a-b>0 故:     

a=a-b=;     ans=;

此時仍是a-b>0 

a=a-b=;     ans=;

...a=a-b=;     ans=;

此時 a-b<0 b退一位 取b=

③此時a-b>0 故:

a=a-b=;     ans=;

...a=a-b=;     ans=;

此時a-b<0 已經退了3次位數,計算結束。

計算結果

1053

第一種的效率是不可取的,例如計算11111÷1時,方法一要計算11111次,而方法二只需要5次.

[**實現]

#include#include#include#define n 501

using namespace std;

/*判斷a.size 與b.size的關係以及做減法*/

int judge(char a,int a1,char b,int b1)

}/*減法*/

for(int i=0;i=0;i--)

return 0; /* a=b的情況 */ }

string division(string a,string b)

} b_size=temp_size;

/*加快除法,高位減起*/

for(int j=0;j<=diff_size;j++) }

/*處理最後結果進製*/

for(int i=0;i=10)

}/*返回string型別*/

string c="";

int n=n-1;

/*去掉沒意義的0*/

while(ans[n]==0 && n>0) n-=1;

for(int i=n;i>=0;i--)

c+=(ans[i]+'0');

return c;

}int main()

{ string a,b;

while(cin>>a>>b)

{ cout<

高精度演算法 大數除法

由於被除數很大超過了longlong或者unsigned longlong,就需要使用大數除法。給定兩個正整數a,b,請你計算 a b的商和餘數。輸入格式 共兩行,第一行包含整數a,第二行包含整數b。輸出格式 共兩行,第一行輸出所求的商,第二行輸出所求餘數。資料範圍 1 a的長度 100000 1 ...

高精度之大數除法

大數除法說的比較少或許不像加法減法那樣簡單,或許是用的不太多。到底怎麼我也不知道。反正你會了加法減法,乘法而不會除法,就像是,開啟電腦而不玩遊戲,心裡難受。我是從看到了大神部落格後學習了一下。部落格中講的很詳細 讓人一看就懂,我很佩服這位同學。果斷的關注了。畢竟別人寫的是別人的。自己寫的才是自己的 ...

高精度除法

演算法思想 反覆做減法,看看從被除數裡最多能減去多少個除數,商就是多少 所以演算法核心是寫乙個大整數的減法函式 反覆呼叫該函式進行減法操作 演算法步驟 用陣列a表示被除數,陣列b表示除數,陣列res表示商 先用被除數a減去除數b得到差的位數k,同時商 1 再用被除數a減去若干個除數b 10 k 不夠...