【pat乙级】A除以B

(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循环中每一步按照手写时的操作来,模拟手写。

代码中有注释掉的调试信息,打印调试信息观察计算过程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值