博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法拾遗】大数相加(不开辟额外空间)
阅读量:6982 次
发布时间:2019-06-27

本文共 1783 字,大约阅读时间需要 5 分钟。

转载请注明出处:

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

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

    s1:

    s2:

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

    s1:

    s2:

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

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

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

这边得到了结果。

    完整实现代码例如以下:

/******************字符串实现大数相加Author:兰亭风雨Date:2014-05-11******************/#include
#include
#define MAX 100char *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] = '\0'; } else { //假设次高位有进位 for(i=0;i<=Maxlen;i++) s1[i] = s1[i] +'0'; s1[i] = '\0'; } 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\n"); return 0;}
    測试结果:

    

转载于:https://www.cnblogs.com/yutingliuyl/p/6722679.html

你可能感兴趣的文章
Sql Server 2005 基于通知的缓存失效
查看>>
理解Windows中的路由表和默认网关
查看>>
.NET多线程编程(13)——一个简单的C#多线程间同步的例子
查看>>
mysql数据导入中文乱码的解决办法
查看>>
Exception和Error分析(—)—UnsatisfiedLinkError
查看>>
VMM系列之使用VMM服务器构建Hyper-V主机(1)
查看>>
cdh4.6.0到cdh5.2.0 upgrade和rollback问题小结
查看>>
MalformedInputException处理
查看>>
OPENAPI的测试用例编写方法
查看>>
在Windows Server 2008 R2上安装 PowerShell 5.0
查看>>
事件通知(Event Notification)实践
查看>>
快速构建Windows 8风格应用28-临时应用数据
查看>>
DVWA系列之12 利用Burpsuite进行暴力破解
查看>>
华为VRRP(不同vlan之间的冗余备份)
查看>>
单片机数码管码段
查看>>
Liferay 启动过程分析14-初始化resource code
查看>>
实验(一):认识数据库的参数文件
查看>>
\做为分割符要注意的问题
查看>>
解决使用perl lwp访问网页乱码的问题
查看>>
java json和object互换
查看>>