c语言double溢出,c语言中浮点数溢出判断

首页 > 大全 > 作者:YD1662022-12-25 20:54:06

c语言double溢出,c语言中浮点数溢出判断(1)

c语言double溢出,c语言中浮点数溢出判断(2)

以上数据溢出无法比较

数字比较跟字符串比较是有差别的,不能直接strcmp完事了。

数字比较主要考虑是数字对齐

下面是算法比较

支持很长很长大大数串

c语言double溢出,c语言中浮点数溢出判断(3)

c语言double溢出,c语言中浮点数溢出判断(4)

#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;

}

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.