比较两个大整数的大小。输入两个大整数s1和s2,长度不超过100位,可能含有前导0,如果s1等于s2输出0,如果s1大于s2输出1,如果s1小于s2输出-1。用c语言实现
时间: 2025-03-09 17:08:28 浏览: 50
比较两个大整数的大小是一个常见的任务,尤其在处理超出标准数据类型范围的大数时非常重要。由于C语言的标准库并不支持任意精度算术运算,因此需要我们手动实现这种比较操作。
下面将展示一段简单的 C 代码来完成这一工作。这段程序首先会去除输入字符串中的所有前导零(leading zeros),然后通过逐位对比的方式来确定这两个数之间的相对大小。
### 源码示例
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 105 // 定义最大允许长度+1作为缓冲区预留空间
// 功能:跳过并返回去除了前导零后的子串起始位置指针
const char* skipLeadingZeros(const char* numStr) {
while(*numStr == '0' && *(numStr + 1) != '\0') ++numStr; // 跳过连续的前导"0"
return numStr;
}
int compareBigIntegers(const char* s1, const char* s2){
// 去除两边可能存在的多余空白字符(如'\r','\n')
s1 = strpbrk(s1, " \t\r\n") ? strpbrk(s1, " \t\r\n")+1 : s1;
s2 = strpbrk(s2, " \t\r\n") ? strpbrk(s2, " \t\r\n")+1 : s2;
// 首先移除所有的前导零以简化后续步骤.
s1 = skipLeadingZeros(s1);
s2 = skipLeadingZeros(s2);
// 特殊情况检查: 空字符串被视为“零”
if(strlen(s1)==0 && strlen(s2)>0)
return -1;
else if(strlen(s1)>0 && strlen(s2)==0)
return 1;
// 直接基于字符串长度做出初步判断:
size_t lenS1=strlen(s1), lenS2=strlen(s2);
if(lenS1>lenS2) return 1;
if(lenS1<lenS2) return -1;
// 字符串长度相同时则逐一字符进行ASCII值对比直到发现差异为止:
for(size_t i=0 ;i<lenS1;i++){
if(s1[i]<s2[i]) return -1;
else if(s1[i]>s2[i]) return 1;
}
// 如果循环结束后仍未分出高下说明两数完全一致
return 0;
}
int main(){
char bigIntegerA[MAX_LENGTH],bigIntegerB[MAX_LENGTH];
printf("请输入第一个大整数:");
scanf("%s", bigIntegerA);
getchar(); // 吸收换行符
printf("\n请输入第二个大整数:");
scanf("%s", bigIntegerB);
switch(compareBigIntegers(bigIntegerA,bigIntegerB)){
case -1:
puts("-1"); break;
case 0:
puts("0"); break;
default:
puts("1");
}
return EXIT_SUCCESS;
}
```
此段代码实现了从用户那里接收两个长字符串表示的大整数,并按照规则输出相应的结果 (`-1`, `0` 或者 `1`) 来指示两者间的大小关系。对于每个给定的大整数,它都会尝试尽可能多地忽略那些不影响数值本身的前缀字符——特别是前导零。之后再根据字符串的实际内容来进行详细的字节级匹配,从而得出结论。
### §注意事项§:
1. 上述实现假定了输入只包含有效的十进制阿拉伯数字;
2. 输入字符串的最大长度被设定为104个有效字符加终止符`\0`;
3. 当遇到非数字字符或其他意外状况时应适当添加错误检测机制。
---
阅读全文
相关推荐












