A/B problem II

题目描述:

给定两个大整数p、q。请你求出p整除q的商和余数。

输入格式:

第一行为大整数p(不超过1000位)。

第二行为大整数q(不超过1000位)。


 

输出格式:

两行,

第一行为商。

第二行为余数

样例输入

512
12

样例输出

42
8
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],c[10001],t[10001];
int compare(int aa[],int tt[]){
    if(aa[0]<tt[0]) return -1;
    if(aa[0]>tt[0]) return 1;
    for(int i=aa[0];i>=1;i--){
        if(aa[i]>tt[i]) return 1;
        if(aa[i]<tt[i]) return -1;
    }
    return 0;
}//比较大小
void numcpy(int bb[],int tt[],int n){
    for(int i=1;i<=bb[0];i++){
        tt[n++]=bb[i];
    }
    tt[0]=n-1;
}//构造减数,t数组从第n位开始存b数组
int main(){
    string s1,s2;
    cin>>s1>>s2;//输入两个字符串s1,s2
    a[0]=s1.size();
    b[0]=s2.size();
    c[0]=a[0]-b[0]+1;//长度
    if(c[0]<=0){
        cout<<"0"<<endl<<s1;
        return 0;
    } 
    for(int i=1;i<=a[0];i++){
        a[i]=s1[a[0]-i]-'0';
    }
    for(int i=1;i<=b[0];i++){
        b[i]=s2[b[0]-i]-'0';
    }//倒序放进int数组
    for(int j=c[0];j>=1;j--){
        numcpy(b,t,j);
        while(compare(a,t)>=0){
            c[j]++;
            for(int i=1;i<=t[0];i++) a[i]=a[i]-t[i];
            for(int i=1;i<=t[0];i++){
                if(a[i]<0){
                    a[i+1]--;
                    a[i]+=10;
                }
            }//高精度减法,被减数a去减构建的减数t
        while(a[0]>1&&a[a[0]]==0) a[0]--;//高位去零
        }
    }
    while(c[0]>1&&c[c[0]]==0) c[0]--;//高位去零
    for(int i=c[0];i>=1;i--){
        cout<<c[i];
    }
    cout<<endl;
    for(int j=a[0];j>=1;j--){
        cout<<a[j];
    }//倒序输出
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzxycdy/article/details/121305402