题目
题目地址: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 }
原文地址:https://www.cnblogs.com/moujun1001/p/9976157.html
时间: 2024-10-11 19:21:00