以下是一个用C语言编写的程序,用于计算大数被除数除以较小除数的余数。程序通过命令行参数接收除数(1-9位)和被除数(3~240位)的十进制数字字符串,并输出余数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 检查字符串是否全部由数字字符组成
int is_all_digits(const char *str) {
for (int i = 0; str[i] != '\0'; i++) {
if (!isdigit((unsigned char)str[i])) {
return 0;
}
}
return 1;
}
int main(int argc, char *argv[]) {
// 检查命令行参数数量
if (argc != 3) {
fprintf(stderr, "用法: %s <除数(1~9位)> <被除数(3~240位)>\n", argv[0]);
return 1;
}
char *divisor_str = argv[1];
char *dividend_str = argv[2];
// 验证除数:长度1~9且全为数字
int divisor_len = strlen(divisor_str);
if (divisor_len < 1 || divisor_len > 9) {
fprintf(stderr, "错误: 除数必须是1~9位十进制数字。\n");
return 1;
}
if (!is_all_digits(divisor_str)) {
fprintf(stderr, "错误: 除数包含非数字字符。\n");
return 1;
}
// 验证被除数:长度3~240且全为数字
int dividend_len = strlen(dividend_str);
if (dividend_len < 3 || dividend_len > 240) {
fprintf(stderr, "错误: 被除数必须是3~240位十进制数字。\n");
return 1;
}
if (!is_all_digits(dividend_str)) {
fprintf(stderr, "错误: 被除数包含非数字字符。\n");
return 1;
}
// 将除数转换为无符号长整型
unsigned long long divisor = strtoull(divisor_str, NULL, 10);
if (divisor == 0) {
fprintf(stderr, "错误: 除数不能为零。\n");
return 1;
}
// 核心计算:模拟手算除法,逐位处理被除数
unsigned long long remainder = 0;
for (int i = 0; i < dividend_len; i++) {
int digit = dividend_str[i] - '0'; // 将字符转换为数字
remainder = remainder * 10 + digit; // 当前中间值
remainder %= divisor; // 更新余数
}
// 输出结果
printf("余数: %llu\n", remainder);
return 0;
}
程序说明
-
核心算法:
- 程序采用模拟手算除法的方式,从被除数最高位开始逐位处理。
- 维护一个当前余数
remainder,初始为0。对于被除数的每一位,执行remainder = remainder * 10 + digit,然后对除数取模,更新余数。 - 处理完所有位后,
remainder即为最终余数。
-
输入验证:
- 检查命令行参数数量是否为两个。
- 验证除数字符串长度为1-9位,被除数字符串长度为3~240位,且两者均由纯数字字符组成。
- 检查除数是否为0(非法输入)。
-
数据类型选择:
- 除数最多9位十进制数(最大值
999,999,999),远小于unsigned long long类型的最大值(约1.8×10^19),因此可以用strtoull安全转换。 - 计算过程中的中间值
remainder始终小于除数,因此同样可以用unsigned long long安全存储,不会溢出。
- 除数最多9位十进制数(最大值
-
编译与运行:
-
将代码保存为文件(如
remainder.c)。 -
使用C编译器编译,例如:
where gcc
D:\Strawberry\c\bin\gcc.exe
gcc -o remainder.exe remainder.c -
运行示例:
./remainder 123 456789输出:
余数: 6(因为456789 ÷ 123 = 3713 ... 6)
-
关键点
- 高效性:算法时间复杂度为 O(n),其中 n 是被除数的位数,最多240位,计算速度极快。
- 安全性:严格验证输入格式,避免无效输入导致错误。
- 适用性:适用于除数为1~9位、被除数最多240位的大数取模计算。
如果需要处理更大范围的被除数(如超过240位),只需调整被除数字符串的长度限制即可,核心算法无需改变。
1001

被折叠的 条评论
为什么被折叠?



