• 【算法拾遗】大数相加(不开辟额外空间)


    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25555743


        大数相加能够借助多种方法来实现,这里提供了一种链表节点的数据域为int型(用char型也能够,这样更省空间)的思路。这篇文章採用经常使用的转变为字符串进行处理的方法。以下说下我用字符串实现大数相加的思路:

        假设输入了例如以下两个字符串(当中上面的红色部分表示数组的下标,以下的绿色和黄色部分表示各字符):

        s1:


        s2:

        非常明显,s1的实际长度为4,s2的实际长度为7,将二者在最低位出对齐,并将前面空出来的高位用0替换,最高位留出来。以备相加到最左边有进位时,能够保存进位1。移位后例如以下所看到的:

        s1:


        s2:


        这里没有了'',是因为移动的时候覆盖掉了,暂且无论,接下来我们就要运行相加的操作,因为每一个字符的ASCII值均在0-255之间,因此我们不是必需在另外开辟int数组,能够直接在char数组上进行移位、相加等操作,仅仅要注意不要将还没移动或者相加的数据覆盖掉即可。

        我们假设二者相加后的结果存放到s1中,则相加后,s1例如以下:


        这是次高位没有进位,因此最高位还是0,最后我们将s1中的各int值再转化为字符。假设s1[0]为1,则直接转化,假设s1[0]为0,则转化后,须要将字符依次向前移动一位,最后,在最后一个字符的后面加上'',表示字符串的结束。

    这边得到了结果。


        完整实现代码例如以下:

    /******************
    字符串实现大数相加
    Author:兰亭风雨
    Date:2014-05-11
    ******************/
    #include<stdio.h>
    #include<string.h>
    
    #define MAX 100
    
    char *BigDataAdd(char *s1,char *s2)
    {
    	if(s1==NULL || s2==NULL)
    		return NULL;
    
    	int len1 = strlen(s1);
    	int len2 = strlen(s2);
    	int Maxlen = (len1>len2)?len1:len2;
    	
    	//将相应的字符转化为整数。并使二者对齐到Maxlen处,
    	//前面的字符通过memset用ASCII值为0的字符替换。
    	//最高位留出来。假设次高位发生进位。则能够保存进位1,
    	//这里s1和s2相当于变为了整数数组。因为字符的ASCII值在0-255之间。
    	//因此这里不用开辟int数组,直接用自身的char数组即可
    	int i,k;
    	for(i=len1-1,k=Maxlen;i>=0;i--,k--)
    		s1[k] = s1[i] - '0';
    	if(k>=0)
    		memset(s1,0,(k+1)*sizeof(char));
    	for(i=len2-1,k=Maxlen;i>=0;i--,k--)
    		s2[k] = s2[i] - '0';
    	if(k>=0)
    		memset(s2,0,(k+1)*sizeof(char));
    
    	//整数数组相加到s1中
    	for(i=Maxlen;i>=1;i--)
    	{
    		s1[i] += s2[i];
    		if(s1[i]>=10)
    		{
    			s1[i] -= 10;
    			s1[i-1] += 1;
    		}
    	}
    	
    	//将s1转换为为相加后的字符串
    	if(s1[0] == 0)
    	{	//假设次高位没有进位
    		for(i=1;i<=Maxlen;i++)
    			s1[i-1] = s1[i] +'0';
    		s1[i-1] = '';
    	}
    	else
    	{	//假设次高位有进位
    		for(i=0;i<=Maxlen;i++)
    			s1[i] = s1[i] +'0';
    		s1[i] = '';
    	}
    	return s1;
    }
    
    int main()
    {
    	char s1[MAX];
    	char s2[MAX];
    	gets(s1);
    	gets(s2);
    	char *result = BigDataAdd(s1,s2);
    	if(result != NULL)
    		puts(result);
    	else
    		printf("Wrong
    ");
    	return 0;
    }

        測试结果:


        


  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6722679.html
Copyright © 2020-2023  润新知