专栏:PAT乙级刷题笔记
题目
计算 A / B A/B A/B,其中 A A A是不超过1000位的正整数、 B B B是一位正整数。输出商数 Q Q Q和余数 R R R。
输入格式
输入在一行中依次给出 A A A 和 B B B,中间以 1 空格分隔。
输出格式
在一行中依次输出 Q Q Q 和 R R R,中间以 1 空格分隔。
输入样例
123456789050987654321 7
输出样例
17636684150141093474 3
分析
其实就是仿造手算除法的过程。
如果设
t
1
t_1
t1位正在被除的那一位的数,
t
2
t_2
t2为上一位运算的余数,
x
x
x表示除数,那么运算的商显然为
(
t
1
+
t
2
×
10
)
/
x
(t_1+t_2\times10)/x
(t1+t2×10)/x
以
145
÷
4
145\div 4
145÷4为例,
t
1
t_1
t1、
t
2
t_2
t2的变化如下表
t 1 t_1 t1 | t 2 t_2 t2 |
---|---|
1 | 0(初始为0) |
14 | 1 |
25 | 2 |
代码写的还是蛮清楚的,手动模拟下就好。
代码
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1;
int x,t1,t2 = 0;//t1表示正在被除的数,t2表示上一位运算后的余数
cin>>s1>>x;
for(int i = 0, j = 0;i < s1.length();++i,++j){
if(s1.length() == 1 && s1[0] - '0' < x){
cout<<0<<" "<<s1[0];
return 0;
}//一种特殊情况,即a/b但a<b
t1 = (s1[i] - '0') + t2*10;
if(t1 >= x){
cout<<t1/x;
t2 = t1%x;
}
else{
t2 = t1;
if(j != 0)//防止第一位小于x时,输出0
cout<<'0';
}
}
cout<<" "<<t2;//输出余数
return 0;
}