帶余除法
阿新 • • 發佈:2018-07-04
int turn class lag 無需 輸入 復制 取余 std
【題目描述】
給定被除數和除數,求整數商及余數。此題中請使用默認的整除和取余運算,無需對結果進行任何特殊處理。
【輸入】
一行,包含兩個整數,依次為被除數和除數(除數非零),中間用一個空格隔開。
【輸出】
一行,包含兩個整數,依次為整數商和余數,中間用一個空格隔開。
【輸入樣例】
10 3
【輸出樣例】
3 1
代碼:
#include<bits/stdc++.h> using namespace std; int c[405],a[405],b[405]; int hh=0; void divide_read(int a[]) { string str; cin>>str; a[0]=str.length();//為了省空間 嗯~ for(int i=1;i<=a[0];i++) { a[i]=str[a[0]-i]-‘0‘;//存儲 } } void divide_write(int a[]) { if(a[0]==0)//輸出就不用說了 { cout<<0<<endl; return ; } for(int i=a[0];i>0;i--) cout<<a[i]; cout<<endl; return ; } int cmp(int a[],int b[]) { if(a[0]>b[0]) return 1;//除數比被除數大 if(a[0]<b[0]) return -1;//除數比被除數小,%操作時直接輸出 for(int i=a[0];i>0;i--) { if(a[i]>b[i]) return 1;//一位一位的判斷 if(a[i]<b[i]) return -1; } return 0; } void jian(int a[],int b[])//計算a=a-b { int flag=cmp(a,b); if(flag==0) { a[0]=0; return ; } if(flag==1)//除數比被除數大 { for(int i=1;i<=a[0];i++) { if(a[i]<b[i])//借位 { a[i+1]--; a[i]+=10; } a[i]-=b[i]; } while(a[0]>0&&a[a[0]]==0) a[0]--;//去0 return ; } } void num(int p[],int q[],int det)//復制p數組到q數組det開始的地方,這樣就不會影響%的操作 { for(int i=1;i<=p[0];i++) q[i+det-1]=p[i]; q[0]=p[0]+det-1; } void divide(int a[],int b[],int c[]) { int tmp[404]; c[0]=a[0]-b[0]+1;//商的位數 for(int i=c[0];i>0;i--) { memset(tmp,0,sizeof(tmp));//清零 num(b,tmp,i);//復制 while(cmp(a,tmp)>=0) { c[i]++; jian(a,tmp);//計算,模擬 } } while(c[0]>0&&c[c[0]]==0) c[0]--;//去0 return ; } int main() { int maxn=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); divide_read(a); divide_read(b); divide(a,b,c); divide_write(c); divide_write(a); return 0; }
帶余除法