题解
2025-08-01 00:07:30
发布于:北京
4阅读
0回复
0点赞
输入的整数可能非常大,要爆long long,因此将输入的 n和m作为字符串处理。
使用字符串模拟大整数的除法
模拟长除法:
从 n 的高位开始,逐位取数字,组成一个当前被除数(初始余数为 0)。
每次将当前被除数乘以 10(即向左移位,相当于处理下一位)并加上新数字。
对当前被除数除以 m,得到商的当前位和新的余数。
重复此过程,直到处理完 n 的所有位。
代码实现
初始化余数 yushu = 0 和商字符串 shang = ""。
遍历 n 的每一位数字:
将当前余数乘以 10(模拟向左移位)并加上当前数字(digit - '0' 转换为整数)。
计算当前被除数除以 m 的商(yushu / m),追加到 shang。
更新余数为 yushu % m。
这样逐位模拟了长除法的过程。
注意要处理商的前导零
使用 find_first_not_of('0') 找到第一个非零字符的位置。
如果整个商是零(start == string::npos),输出 "0"。
否则,截取从第一个非零字符开始的子字符串作为商
#include <bits/stdc++.h>
using namespace std;
int main() {
string n;
long long m;
cin >> n >> m;
//如果 n 比 m 小,商为 0,余数为 n
string shang = "";
long long yushu = 0;
//逐位处理 n
for (char digit : n) {
yushu = yushu * 10 + (digit - '0');
shang += to_string(yushu / m);
yushu%=m;
}
// 去除商的前导零
size_t start = shang.find_first_not_of('0');
if (start == string::npos) {
shang = "0";
} else {
shang=shang.substr(start);
}
cout<<shang<<endl<<yushu;
return 0;
}
这里空空如也
有帮助,赞一个