【PAT Basic Level】1017 A除以B


专栏: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
10(初始为0)
141
252

代码写的还是蛮清楚的,手动模拟下就好。

代码

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值