PAT 乙级 1017

题目

    题目地址:PAT 乙级 1017

 

题解

    粗看是一道大数除法题,实际上只不过是通过字符数组模拟除法过程,理解之后还是比较简单的;

    具体分析一下本题;

    因为题设中的除数(n)是一位整数,因此大幅简化了整个运算过程;在整个运算中最为重要的就是中间变量(sum),判断中间变量sum是否足够大能被除数n整除,这也是本题的关键所在;

    通过是否判断sum是否能被整除,可以分为以下两种情况:

          1. sum == 0 && num[i] < n (当前运算位num[i]小于除数)

          2. 其余情况(sum == 0 && num[i] >= n  sum != 0 && num[i] < n  sum != 0 && num[i] >= n

    第一种情况,sum当前值不够除被除数,因此要作为一种情况单独处理;

    第二种情况,sum的值无论怎样都够除除数n,因此可以全部作为一类情况处理;(如果sum不为0,说明是上一次运算没有除尽的部分,又因为是上一位的剩余,所以要乘以10,那么无论怎样都够除)

    之后我们再来分析一下两种不同情况下的处理方式:

          1. 因为中间变量不够除,也就是说,当前操作位在不是首位的情况下会商0;接下来需要改变中间变量sum的值,因此操作位后移一位加到sum;(特别注意,因为要后移一位,所以需要判断边界防止越界操作)

          2. 无论上一位是否有剩余,都把上一位的值乘以10,加上当前操作位的值;

 

代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main() {
 6     string num;
 7     int n = 0, sum = 0;
 8     cin >> num >> n;
 9     for (int i = 0; i < num.size(); i++) {
10         if (sum == 0 && int(num[i]) - 48 < n && i != num.size() - 1) {
11             if (i != 0)
12                 cout << '0';
13             sum += (int(num[i]) - 48) * 10;
14             i++;
15             sum += int(num[i]) - 48;
16         }
17         else {
18             sum *= 10;
19             sum += int(num[i]) - 48;
20         }
21         cout << sum / n;
22         sum %= n;
23     }
24     cout << ' ' << sum << endl;
25 
26     return 0;
27 }

 

posted @ 2018-11-17 23:03  moujun  阅读(364)  评论(0编辑  收藏  举报