带余除法
【题目描述】
给定被除数和除数,求整数商及余数。此题中请使用默认的整除和取余运算,无需对结果进行任何特殊处理。
【输入】
一行,包含两个整数,依次为被除数和除数(除数非零),中间用一个空格隔开。
【输出】
一行,包含两个整数,依次为整数商和余数,中间用一个空格隔开。
【输入样例】
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; }