(pat乙级1017)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
c++代码:
#include<iostream>
using namespace std;
int main(){
string a;
int b;
cin>>a>>b;
int l=a.length();
int prenextnum=0,thisnum=a[0]-'0',index=0,flag0=0,flag_this=0; //flag0判断是否第一位非0商已出现,从第一位非0商开始输出
if(l==1){
int result=(a[0]-'0')/b;
cout<<result<<" "<<a[0]-'0'-result;
}
for(int i=1;i<l;i++){
if(thisnum>=b){ //当前thisnum够除,改变下次的thisnum计算方式
// cout<<">=b thisnum:"<<thisnum<<" ";
// cout<<" 输出:";
int result=thisnum/b;
if((flag0==1&&result==0)||result!=0)
cout<<result;
if(result!=0)flag0=1;
prenextnum=thisnum-(thisnum/b)*b;
thisnum=prenextnum;
// cout<<" thisnum变为:"<<thisnum<<endl;
flag_this=1;
}
if(flag_this==1){ //当前thisnum>=b但还未加上当前a[i]
if(i!=l-1){
thisnum*=10;
// cout<<"flag_this=1 "<<"a["<<i<<"]:"<<a[i]-'0'<<endl;
thisnum+=(a[i]-'0');
if(thisnum<b)cout<<"0";
}
else{
// cout<<" 输出:";
thisnum*=10;
thisnum+=(a[i]-'0');
int result=thisnum/b;
if((flag0==1&&result==0)||result!=0)
cout<<result;
if(result!=0)flag0=1;
int yushu=thisnum-(thisnum/b)*b;
cout<<" "<<thisnum-(thisnum/b)*b;
}
}
else if(thisnum<b){ //还不够除
if(i!=l-1){
// cout<<"<b thisnum:"<<thisnum<<" ";
thisnum*=10;
thisnum+=(a[i]-'0');
if(thisnum<b&&flag0==1)cout<<"0";
// cout<<" thisnum变为:"<<thisnum<<endl;
flag_this==0;
}
else{
// cout<<" 输出:";
thisnum*=10;
thisnum+=(a[i]-'0');
int result=thisnum/b;
if((flag0==1&&result==0)||result!=0)
cout<<result;
if(result!=0)flag0=1;
int yushu=thisnum-(thisnum/b)*b;
cout<<" "<<thisnum-(thisnum/b)*b;
}
}
}
return 0;
}
//测试样例:123456789050987654321 7
注意:
1.余数为0时仍要输出余数
2.输出商时,从第一位非0商开始输出
此题限制了除数b只为一位正整数,降低了难度,升级版为大整数除法。
思路是先手写样例中两个数的除法,把大数a当做字符串for循环遍历a的每一位,for循环中每一步按照手写时的操作来,模拟手写。
代码中有注释掉的调试信息,打印调试信息观察计算过程。