阅读程序 · 答案 p[0]rest<qq>restrest/qrest%q*10+p[i]rest%q · 考点:输入输出、位运算、分支结构、循环结构、高精度计算
← 整套速查表 NOIP 提高组初赛 全部真题(大整数除法)给定两个正整数 $p$ 和 $q$,其中 $p$ 不超过 $10^{100}$, $q$ 不超过 $100000$, 求 $p$ 除以 $q$ 的商和余数。
(第一空 $2$ 分,其余 $3$ 分) 输入:第一行是 $p$ 的位数 $n$,第二行是正整数 $p$,第三行是正整数 $q$。 输出:两行,分别是 $p$ 除以 $q$ 的商和余数。
#include <iostream>
using namespace std;
int p[100];
int n, i, q, rest;
char c;
int main()
{
cin >> n;
for (i = 0;
i < n; i++)
{
cin >> c;
p[i] = c - '0';
}
cin >> q;
rest = (1);
i = 1;
while ((2) && i < n)
{
rest = rest * 10 + p[i];
i++;
}
if (rest < q)
cout << 0 << endl;
else
{
cout << (3);
while (i < n)
{
rest = (4);
i++;
cout << rest / q;
}
cout << endl;
}
cout << (5) << endl;
return 0;
}模拟竖式除法:rest<q 时商 0 继续拉位;rest>=q 时商 rest/q,余数 rest%q*10+p[i]。
循环条件漏等号导致商 1 漏位;更新余数先除后取模顺序颠倒;最后输出余数忘取模直接输 rest。
考点:高精度除法模拟|竖式算法
输入大整数 p 和 q,模拟手算除法:从高位开始,余数乘 10 加下一位,够除则商,否则商 0,最后输出余数。