加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

字符串与大数比较

发布时间:2020-12-14 02:22:37 所属栏目:大数据 来源:网络整理
导读:字符串与大数比较,有两中思路, 第一:将字符串转成对应进制的数字,然后比较两个数的大小 第二:将数字转化成对应的字符串,然后进行比较 如果这个数在系统表示范围之内,将字符串转换成数字比较比较方便,如果这个数字太大,则转化成字符串进行比较比较合

字符串与大数比较,有两中思路,

第一:将字符串转成对应进制的数字,然后比较两个数的大小

第二:将数字转化成对应的字符串,然后进行比较

如果这个数在系统表示范围之内,将字符串转换成数字比较比较方便,如果这个数字太大,则转化成字符串进行比较比较合适。


下面这段代码是将一个大数转化成字符串进行比较,一般用不到,所以先记下来:

#include <stdio.h>
#include <string.h>

#define MAX_LEN 32

int Compare_str(char *stb_str,char *start_str)
{
	int is_large_than_start = 0;
	int i=0,length_stb = 0,length_start = 0;
	char ch_stb,ch_start;

	length_stb = strlen(stb_str);
	length_start = strlen(start_str);

	//先比较长度,如果长度不相等,再逐位比较
	if(length_stb<length_start)
	{
		is_large_than_start = 0;
	}
	else if(length_stb>length_start)
	{
		is_large_than_start = 1;
	}
	else if(length_stb=length_start)
	{
		for(i=0;i<length_stb;i++)
		{
			ch_stb = stb_str[i];
			ch_start = start_str[i];
			if((int)ch_stb<(int)ch_start)
			{
				is_large_than_start = 0;
				break;
			}
			else if((int)ch_stb>(int)ch_start)
			{
				is_large_than_start = 1;
				break;
			}
		}

		if(i>=length_stb)
		{
			is_large_than_start = 1;
		}
	}

	return is_large_than_start;
}


void Delete_left_zero_from_str(char * str_source)
{
	int i =0,count = 0;
	char tmp[MAX_LEN]={0};

	//printf("str_source:%s,strelen(str_source):%d",str_source,strlen(str_source));
	for(i=0,count=0;i<strlen(str_source);i++)
	{
		if(str_source[i]=='0')
		{
			count++;
		}
		else
		{
			break;
		}
	}

	//printf("count:%d",count);
	strcpy(tmp,str_source+count);
	memset(str_source,sizeof(str_source));
	strcpy(str_source,tmp);
	//printf("str_source:%s,strlen(str_source));
}

unsigned long long ChangeNum(char *str,int base)   
{   
	char  revstr[MAX_LEN]={0};  //根据十六进制字符串的长度,这里注意数组不要越界
	int   num[MAX_LEN]={0};   
	unsigned long long   count=1,result=0;  
	int length = 0,i = 0;

	length = strlen(str);
	if(length>MAX_LEN)
	{
		printf("space err");
		return 0;
	}
	strcpy(revstr,str);

	//printf("revstr:%s length:%dn",revstr,length);
	
	for(i=length-1;i>=0;i--)   
	{   
		//printf("revstr[%d]=%cn",i,revstr[i]);
		if ((revstr[i]>='0') && (revstr[i]<='9'))   
		{
			num[i]=revstr[i]-48;//字符0的ASCII值为48
		}
		else if ((revstr[i]>='a') && (revstr[i]<='f'))   
		{
			num[i]=revstr[i]-'a'+10;   
		}
		else if ((revstr[i]>='A') && (revstr[i]<='F'))   
		{
			num[i]=revstr[i]-'A'+10;   
		}
		else   
		{
			num[i]=0; 
		}
		result=result+num[i]*count;   
		count=count*base;//十六进制(如果是八进制就在这里乘以8)    
 	}  

	//printf("result:%llun",result);
 	return result;   
}

int main()
{
	//假设tmp_str就是源字符串。
	unsigned long long tmp_num = 0;
	char stb_str[MAX_LEN]="10208889999999998";
	char tmp_str[MAX_LEN]="2444EE6E0043FF",src_str[MAX_LEN]={0};

	//把接收到的16进制序列号转成10进制字符串,
	tmp_num = ChangeNum(tmp_str,16);
	memset(src_str,0x00,src_str(src_str));
	sprintf(src_str,"%lld",tmp_num);

	//如果左边有0,则去掉无效位
	Delete_left_zero_from_str(src_str);

	if(Compare_str(stb_str,src_str))
	{
		printf("stb_str > src_str n");
	}

	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读