华为算法题:超长的整形数据相加

求两个长长整型的数据的和并输出。

例如输入2222222222222222222222222 ,99999999999999999999999999999999999999999999

则输出...

void movenegative(char *str,int len)
	{
		if(*str!='-')//if no nagative flag
			return;
		else
		{
			int i=0;
			for(;i<len;i++)
				*(str+i)=*(str+i+1);
			*(str+i)='\0';//the terminal of the string
		}
	}


void stringadd(char *str1,char *str2,char *result)
	{
		char *string1=str1;//先暂且考虑两个正数
		char *string2=str2;
		char *t=result;
		char *stringg;
		int len1=strlen(str1);
		int len2=strlen(str2);
		char *str11=(char*)malloc(sizeof(char)*len1);
		char *str22=(char*)malloc(sizeof(char)*len2);
		movenegative(str1,strlen(str1));
		movenegative(str2,strlen(str2));

		for(int i=0;i<len1;i++)
		{
			*(str11+i)=*(string1+len1-i-1);
		}

		for(int i=0;i<len2;i++)
		{
			*(str22+i)=*(string2+len2-i-1);
		}
		
		int flag=0;
		int temp=0;
		int realvalue=0;
		int len=(strlen(str1)<strlen(str2))?strlen(str1):strlen(str2);
		int reallen=(strlen(str1)>strlen(str2))?strlen(str1):strlen(str2);
		for(int i=0;i<len;i++)
			{
				temp=*(str11+i)+*(str22+i);
				realvalue=temp-2*'0'+flag;//真实值
				*t++=realvalue%10+'0';
				if(realvalue>=10)
					flag=1;
				else
					flag=0;
			}

		if(len1>len2)
				stringg=str1;
		else
				stringg=str2;

		if(reallen>len)
			for(int i=0;i<reallen-len;i++)
			{
				if(flag==1)
					{
						int temp=*(stringg+reallen-len-i-1);
						int real=temp-'0'+flag;
						if(real>=10)
							{
								flag=1;
								*t++=real%10+'0';
							}
						else
							{
								*t++=*(stringg+reallen-len-i-1)+flag;
								flag=0;
							}
					}
				else
				{
					*t++=*(stringg+reallen-len-i-1);
				}
				
			}
		if(flag==1)
		{
			*t++=1+'0';
			reallen++;
		}

		for(int i=0;i<=(reallen-1)/2;i++)//翻转计算结果
		{
			temp=*(result+i);
			*(result+i)=*(result+reallen-i-1);
			*(result+reallen-i-1)=temp;
		}
		*t='\0';
	}	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值