一、问题描述
本题要求计算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%相同的计算,大大简洁了代码。这个告诉我不要满足于第一次成功过的代码,要学会反复雕琢,简化简易代码。