[問題描述]
給出兩個正整數,計算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 不夠...