long double也溢出如何比较大小(C语言大数比较算法)

boyanx1个月前技术教程10



以上数据溢出无法比较

数字比较跟字符串比较是有差别的,不能直接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;

}

标签: 字符对比

相关文章

批量分析文本中字符出现的次数并统计

批量分析文本中字符出现的次数并统计在数据统计及分析数据过程中经常会遇到,对于这个问题的解题思路也很明确,先拆分统计,再去重按条件整合。所以公式为=FILTER(UNIQUE(REGEXP(CONCAT...

Java KMP算法:让字符串匹配不再烦恼

前言在编程的世界里,字符串匹配就像一场“表面简单,内里复杂”的戏码。表面上,两个字符串的比较似乎跟找朋友的名字一样容易;可当数据量爆炸时,那些原本看似轻松的算法瞬间变得如同用手撕牛皮纸,令人崩溃。别担...

JavaScript比较运算符(js比较对象)

JavaScript 语言中有两种比较方式,转换类型比较运算符 == 和严格比较运算符 ===。其中严格比较运算符仅当两个操作数的类型相同且值相等时才为true。而转换类型比较运算符== 会在进行比较...

「数据库调优」屡试不爽的面试连环combo

点赞再看,养成习惯前言面试官:敖丙你简历上写了你会数据库调优,你都是怎么调优的?敖丙:加索引。面试官:还有么?敖丙:没了。面试官:我们公司的门你知道在哪里吧,自己走还是我送你?哈哈开头这个场景是我臆想...

C++字符串比较函数的实现(c++字符串比较大小规则)

项目中基础函数的实现其实更有意思。公司大佬发来消息,说要我看看一个字符串比较函数的实现有没有问题,我仔细看了看,回复说没有发现问题,而且突然觉得基础函数的编写更有意思,更考基础和逻辑思维能力。于是,决...

哪种编程语言又快又省电?有人对比了27种语言

编辑:小舟、张倩在手机快没电时,管理软件往往会提醒我们关掉某些耗电量高的应用。可见,除了硬件厂商外,软件厂商也应该重视能耗问题。在这篇文章中,研究者分析了一下各种编程语言的能耗对比。当能耗也成为了一个...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。