用逐位取模递推计算大整数对 2 至 9 的余数,输出所有因子。
OJ: noi_openjudge
题目 ID: ch0106-13
难度:入门
标签:高精度数学模拟python
日期: 2026-07-30 23:01
题意
给定最多 none。
思路
对每个候选除数,从左到右维护已读前缀的余数。读入下一位 digit 后,新余数为 (remainder * 10 + digit) % divisor。最终余数为零便说明整除。
这种写法不依赖把整串数字转为整数,也适用于更长的十进制数。
代码
Python代码
python
number = input().strip()
divisors = []
for divisor in range(2, 10):
remainder = 0
for digit in number:
remainder = (remainder * 10 + int(digit)) % divisor
if remainder == 0:
divisors.append(str(divisor))
print(" ".join(divisors) if divisors else "none")C++代码
cpp
#include <cstdio>
#include <cstring>
char str[50];
bool is_exists = false;
int main(){
scanf("%s",str);
int i,j,len = strlen(str);
for (i=0;i<len;i++){
str[i] -='0';
}
for (i=2;i<=9;i++){
int pre = 0;
for(j=0;j<len;j++){
int num = pre*10+str[j];
pre = num % i;
}
if( !pre){
printf("%d ",i);
is_exists = 1;
}
}
if(!is_exists)
printf("none");
return 0;
}复杂度
设数字长度为
总结
逐位取模是处理超长整数整除性的通用模板。