用字符串模拟竖式除法,逐位求出大整数除以 13 的商和余数。
OJ: roj
题目 ID: 1175
难度:入门
标签:高精度
创建: 2026-09-29 22:02
更新: 2026-10-05 04:18
题目描述
输入一个长度不超过 100 位的正整数 2132104848488485,样例输出第一行 164008065268345、第二行 0。
思路
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 22:04
# update_at: 2026-09-29 22:04
import sys
def solve() -> None:
data = iter(map(int, sys.stdin.buffer.read().split()))
n: int = next(data) # 题面的大整数 N(Python 的 int 天然任意精度)
print(n // 13)
print(n % 13)
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 04:18
* update_at: 2026-10-05 04:18
*/
#include <cstdio>
#include <cstring>
typedef long long ll;
const int MAXLEN = 105; // 输入位数不超过 100,多开几位防止越界
char num[MAXLEN]; // 题面给出的十进制大整数
char quotient[MAXLEN]; // 保存商的每一位
int main() {
scanf("%s", num);
ll len = strlen(num);
int remainder = 0; // 当前余数,始终在 [0, 13) 之间
int qlen = 0; // 商的位数
// 字符串模拟竖式除法:从高位到低位逐位计算
for (ll i = 0; i < len; i++) {
int cur = remainder * 10 + (num[i] - '0');
char digit = '0' + cur / 13;
remainder = cur % 13;
// 商的前导零不输出
if (digit != '0' || qlen > 0) {
quotient[qlen] = digit;
qlen++;
}
}
if (qlen == 0) { // 商为 0 时仍需输出一个 0
quotient[qlen] = '0';
qlen++;
}
quotient[qlen] = '\0';
printf("%s\n%d\n", quotient, remainder);
return 0;
}