PAT1017 A除以B
题目:
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
题解:
因为A是不超过1000位的整数(不是不超过1000),所以这里用整形类型储存A 不合适,用string变量储存。因为B是一位整数,所以只要将字符串A拆成单字符再转化成数值形式依次除以B,余数参与下一次计算,最后一次将余数储存起来。
思路:
1,定义字符串变量a,q用于储存A,Q,整形变量b,r用于储存B,R
2,利用if语句对单字符讨论(即一位整数A),先获得除数c,再计算。
3,利用循环语句对字符串中的单字符依次计算,
4,按输出格式输出q,r
对每次商和余数的讨论复杂,定义一个整形变量c用于记录每次新获得的除数(c=r*10+a[i]-‘0’)
注意:
1,注意对一位整数和首位单字符计算求得的商为0的特殊讨论。
2,留意字符到数值的变换。不要将不同类型变量弄混。
代码:
#include<iostream>
#include <string.h>
using namespace std;
int main(){
string a,q; //定义题目要求变量A,Q
int b,c,r=0; //定义B,R,c用于获得新除数
cin>>a>>b;
if(a.length()==1){ //特殊情况,一位整数单独讨论
c=a[0]-'0'; //将字符转换为数值形式,进行计算
q=to_string(c/b);
r=c%b;
cout<<q<<" "<<r;
}else{
for(int i=0;i<a.length();i++){ //利用循环语句对每个单字符讨论
c=r*10+a[i]-'0'; //获得整数类型的新除数
if(!(i==0&&c/b==0)) //对首位单字符计算所获得的商为0的特殊讨论
q+=to_string(c/b);
r=c%b;
}
cout<<q<<" "<<r;
}
return 0;
}