以上数据溢出无法比较
数字比较跟字符串比较是有差别的,不能直接strcmp完事了。
数字比较主要考虑是数字对齐
下面是算法比较
支持很长很长大大数串
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int s1_compare_s2(char *s1, char *s2);
int main(int argc, char **argv)
{
char s1[10000] = { '\0' };
char s2[10000] = { '\0' };
lebel:
printf("输入两个大数:\n");
gets_s(s1);
gets_s(s2);
int n = -300;
n = s1_compare_s2(s1, s2);
if (n > 0)
{
printf("s1大于s2\n");
}
else if(n < 0 && n!=-300 && n!=-2)
{
printf("s1小于s2\n");
}
else if(n==0)
{
printf("s1=s2\n");
}
else
{
printf("有误!\n");
}
system("pause");
system("cls");
goto lebel;
return 0;
}
//用字符串形式比较两个超大数(兼容整数和小数)的大小
//s1>s2返回1 s1<s2返回-1 s1=s2返回0
int s1_compare_s2(char *s1, char *s2)
{
if (s1 == NULL || s2 == NULL)return -2;
//首先获取s1和s2的长度
unsigned int s1len = strlen(s1), s2len = strlen(s2);
//s1和s2对齐后的长度相等
unsigned int len = 0;
//统计小数点的个数
unsigned int num = 0;
//s1 和 s2 的小数标记 是小数赋值1 否则0
int sign1 = 0, sign2 = 0;
//小数点位置索引
unsigned int index1 = 0, index2 = 0;
//非法字符退出
for (int i = 0; i < s1len; i )
{
if (*(s1 i) == '.')
{
num ;
sign1 = 1;
index1 = i;
}
if ((!isdigit(*(s1 i)) && *(s1 i) != '.') || num>1)return -2;
}
//重置num值
num = 0;
//非法字符退出
for (int i = 0; i < s2len; i )
{
if (*(s2 i) == '.')
{
num ;
sign2 = 1;
index2 = i;
}
if ((!isdigit(*(s2 i)) && *(s2 i) != '.') || num>1)return -2;
}
//------------------------------
int len1=0;//s1整数部分长度
//计算len1的长度
if (sign1 == 0)
{
len1 = s1len;//是整数
}
else if (sign1 == 1)
{
len1 = index1; //是小数
}
int len2= 0;//s2整数部分长度
//计算len2的长度
if (sign2 == 0)
{
len2 = s2len;//是整数
}
else if (sign2 == 1)
{
len2 = index2; //是小数
}
//计算对齐总长度len
len = (len1 > len2 ? len1 : len2) ( (s1len - len1) > (s2len - len2) ? (s1len - len1) : (s2len - len2) );
//动态分配内存 存放对齐后的s1 和s2
char *ps1 = (char *)malloc(sizeof(char)*len);
char *ps2 = (char *)malloc(sizeof(char)*len);
//初始化指针所指的内存区域
memset(ps1, '0', len);
memset(ps2, '0', len);
//s1和s2复制到内存指针中
for (int i = 0; i < s1len; i )
{
//遇到小数点 把其替换成'0' 反正不影响判断结果
//这个特殊'0'的位置索引前面已经被标记过了
if (*(s1 i) == '.')
{
*(ps1 i) = '0';
}
else
{
*(ps1 i) = *(s1 i);
}
}
for (int i = 0; i < s2len; i )
{
//遇到小数点 把其替换成'0' 反正不影响判断结果
//这个特殊'0'的位置索引前面已经被标记过了
if (*(s2 i) == '.')
{
*(ps2 i) = '0';
}
else
{
*(ps2 i) = *(s2 i);
}
}
//向右平移对齐 平移单位n
int n = 0;
n = abs(len1 - len2);
char *ps1_1 = ps1 n;
char *ps2_1 = ps2 n;
if (len1 > len2)
{
//s2整体右移动n位 源ps2 目标ps2_1
memmove(ps2_1, ps2,s2len);
//腾出位置用'0'填充
for (int i = 0; i < n; i )
{
*(ps2 i) = '0';
}
}
else if (len1 < len2)
{
//s1整体右移动n位 源ps1 目标ps1_1
memmove(ps1_1, ps1, s1len);
//腾出位置用'0'填充
for (int i = 0; i < n; i )
{
*(ps1 i) = '0';
}
}
//----------测试---------部分--------------------
printf("s1:\n");
//开始比较从低索引开始
for (int i = 0; i < len; i )
{
//测试输出结果
printf("%c", *(ps1 i));
}
printf("\n");
printf("s2:\n");
for (int i = 0; i < len; i )
{
printf("%c", *(ps2 i));
}
printf("\n");
system("pause");
//-----------------------------------------------
//开始比较从低索引开始
for (int i = 0; i < len; i )
{
if (*(ps1 i) > *(ps2 i))return 1;//s1大于s2返回1
if (*(ps1 i) < *(ps2 i))return -1;//s1小于s2返回-1
}
free(ps1);
free(ps2);
return 0;
}