大位数相除

来源:互联网 发布:短信猫群发软件 编辑:程序博客网 时间:2024/06/02 07:43

A除以B (20)
题目链接:https://www.patest.cn/contests/pat-b-practise/1017
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3

#include<iostream>#include<string>using namespace std;bool Compare(string first,string second)  {    int i=0;    while('0'==first[i])        i++;    first.erase(0,i);   //删除从0开始的第i个字符 ,其主要目的就是去掉first前面的多余的零;     i=0;       //去掉second前面多余的零     while('0'==second[i])        i++;    second.erase(0,i);    int len1=first.size();    int len2=second.size();    if(len1<len2)  //保证s1大于s2         return false;    else if(len1==len2 && first<second)        return false;    return true;}string Subtraction(string s1,string s2)  {    if(s1==s2)        return "0";    int len1=s1.size();    int len2=s2.size();    for(int i=len2-1;i>=0;i--)    {        s1[len1-1-i] ='0'+ s1[len1-1-i] -s2[len2-1-i];  //不要忘了加‘0’    }    //cout<<s1<<endl;    for(int i=len1-1;i>=0;i--)    {        if(s1[i]<'0')        {            s1[i] += 10;            s1[i-1]--;        }    }    int i=0;    while(s1[i]=='0')        i++;    s1.erase(0,i);  //去掉字符串前面的0    //cout<<s1<<endl;    return s1;}void BigDivision(string a,string b){    string result,s;    //result用来保存商,s用来保存每次的运算时的被除数及最后的余数    int count,i;    if("0"==b)    {        //cout<<"Error,divisor can not be zero!"<<endl;        cout<<"NULL"<<endl;        return;    }    if(!Compare(a,b))  //如果a小于b,那么商是0,余数a     {        //cout<<"商:"<<0<<",余数:"<<a<<endl;        cout<<0<<" "<<a<<endl;        return;    }    int len=a.size();    for(int i=0;i<len;i++)    {        count=0;        s.push_back(a[i]);          while(Compare(s,b))        {            s=Subtraction(s,b);            count++;        }        result+=char(count+'0');    //s>b时加每次相除得到的商或者,s<b时补0    }    //cout<<s<<endl;    i=0;    while('0'==result[i])        i++;    result.erase(0,i);    i=0;    while('0'==s[i])        i++;    s.erase(0,i);    //cout<<"商为:"<<result<<",余数: "<<s<<endl;    cout<<result<<" "<<s<<endl;}int main(){    string str1,str2;    while(cin>>str1>>str2)    //cout<<subtraction(str1,str2)<<endl;        BigDivision(str1,str2);}
0 0