大整数除法
描述
求兩個大的正整數相除的商。
輸入
第1行是被除數,第2行是除數。每個數均不超過100位。
輸出
一行,相應的商的整數部分
樣例輸入
2376
24
樣例輸出
99
樣例(網找)
2405337312963373359009260457742057439230496493930355595797660791082739646
2987192585318701752584429931160870372907079248971095012509790550883793197894
結果應為:0
10000000000000000000000000000000000000000
10000000000
結果應為:1000000000000000000000000000000
5409656775097850895687056798068970934546546575676768678435435345
1
結果應為:5409656775097850895687056798068970934546546575676768678435435345
100000000000000000000000000500
25
結果應為:4000000000000000000000000020
100000000000000
100000000000001
結果應為:0
18446744073709551615000000000000000000000000000000
4294967297
結果應為:4294967295000000000000000000000000000000
1810
9
結果應為:201
解題
因為是大整數的除法,所以一般的除法規則不能運用在這里,我們可以運用減法來表示它
我們用兩個變量表示首末位置
則解題過程可如下圖所示
則具體分為兩部分,判斷大小與減法計數,進行編程
代碼
#include <iostream> #include <cstring> using namespace std; char a[110],b[110]; int aa[110],bb[110]; int main(){cin>>a;//輸入字符串與轉換為常數數組cin>>b;int len_a=strlen(a);int len_b=strlen(b);if(len_a<len_b){cout<<0;return 0;}for (int i = 0; i < len_a; ++i) {aa[i]=a[i]-'0';}for (int i = 0; i < len_b; ++i) {bb[i]=b[i]-'0';}int k=0,ff=0;//k為首位置,ff為標記是否為初始為零情況for (int i = len_b; i <= len_a; ++i) {//i為尾位置int num=0;while(true){int flag=1;//用于標記位數相同時情況int temp=0;int all=0;if(aa[k]==0)k++;if(i-k<len_b)break;else if (i-k==len_b){//位數相同時for (int l = k; l < i; ++l) {if(aa[l]>bb[temp]){flag=0;int tt=0;for (int j = k; j < l; ++j) {if(aa[j]<bb[tt++])flag=1;}break;}if(aa[l]==bb[temp]){all++;}temp++;}//比較if(all==len_b)flag=0;if(flag)break;}ff=1;int bbb=len_b-1;for (int j = i-1; j >= k ; j--) {//減if(aa[j]<bb[bbb]){aa[j]+=10;aa[j-1]-=1;aa[j]-=bb[bbb];}else{aa[j]-=bb[bbb];}bbb--;}num++;}if(ff||len_a==len_b)cout<<num;} }總結
- 上一篇: 动画3D变形:平移、旋转、缩放
- 下一篇: TDM_GCC -lws2_32 参数