【PAT Basic Level】1017 A除以B

    技术2022-07-11  79

    目录

    题目分析代码 专栏: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 t210(初始为0)141252

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

    代码

    #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; }
    Processed: 0.013, SQL: 9