CCF-训练50题-NO.22-A除以B

一、问题描述

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

二、问题分析

这个问题关键点在于不超过1000位的整数和一个一位数,这个不超过一千位的整数应当是以字符串的形式录入,然后模拟小学学的竖式除法。模拟竖式计算做到右依次,直到最后一位那里即可得出结果。

三、算法分析

关键点就在于从被除数的第一位一直循环到最后一位。其中细节是第一位其除以除数之后保留余数,之后每一位的值都是前一位的余数乘以10+原来的数。这样一来就可以一直到最后了。核心部分就是
if (i==0) c=a[i]-‘0’;else c=(a[i-1]-‘0’)*10+(a[i]-‘0’);
这里是控制了每次的被除数,通过这一步就可以直接获得商的每一位了。
if (i!=0||q[i]!=’0’) cout<

#include <iostream>
using namespace std;
int main(){
    string a,q;//A=B*Q+R
    int b;
    cin>>a>>b;

(一)输入的时候,被除数以字符串的格式输入,而除数以整型的格式输入,方便计算。

int la=a.size();
    int c;
    for (int i=0;i<la;i++){

(二)核心步骤,将每位数和前一位数(相同处理之后的余数)的10倍相加作为下一个小被除数。

if (i==0) c=a[i]-'0'; 
        else c=(a[i-1]-'0')*10+(a[i]-'0');
            q[i]=c/b+'0';

(三)小被除数的余数除以除数之后一一储存下来。

a[i]=(c-c/b*b)+'0';

(四)第一位如果是0则不输出。

    if (i!=0||q[i]!='0') cout<<q[i];
    }

(五)最后一位就是最后的余数

    char r=a[la-1];
    cout<<" "<<r;
}

四、分析与总结

这题的要点在于联想到竖式除法。由此可见,平时的计算思维是可以从代码中体现出来的,同时第一次做这题的时候我是将前一位余数是0和第一位列出为第二种情况的,但是经过后来的思考发现是没有这个必要的,只需要对第一个数的小被除数单独列出来就可以,这样避免了两种80%相同的计算,大大简洁了代码。这个告诉我不要满足于第一次成功过的代码,要学会反复雕琢,简化简易代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值