题目描述
题目分析
从题目就可以看出这是一道高精度的问题,如果只是做简单的除法,1000位的数字我们的计算机不可能吃的进去,所以我们要想一种更高效的除法。而且我们的除数是一位数,这让问题变得更简单了。
我们想一想,我们在做普通的除法时,通常会列一个竖式,
我们每次会取前两个数组构成一个两位数,然后让这个两位数除以这个一位数字,将商直接输出(如上图就是46/7,商是 6,直接输出,余数是5保留)。然后我们将余数作为下一个两位数的十位数字和下一个数字组合在一起再除以除数(如上图就是48/7,商是6,余数是6,仍然保留)。后续操作依次进行,我们每次都将商输出,但是保留余数做后续计算,最终得到的余数就是结果。
代码
#include <iostream>
using namespace std;
int main() {
string s;
int a, t = 0, temp = 0;
cin >> s >> a;
int len = s.length();
t = (s[0] - '0') / a;
//这里的目的是为了防止开头前两位与除数做除法得到一个两位数
//所以取第一位先做除法,如果等于零就跳过,不等于0就直接输出,然后用除数作为下一次十位数字
if ((t != 0 && len > 1) || len == 1)
cout << t;
temp = (s[0] - '0') % a;
//从高位到低位逐渐移动,依次进行除法运算
//每次都相当于一个两位数与一位数进行运算并求商和余数
//将商依次输出可组成最后的结果,余数作为下一次运算的十位,当前遍历到的数组作为个位,组成新的被除数进行运算
for (int i = 1; i < len; i++) {
t = (temp * 10 + s[i] - '0') / a;
cout << t;
temp = (temp * 10 + s[i] - '0') % a;
}
cout << " " << temp;
return 0;
}
总结
答题用时18min
Q17——finish√