大数相加(不开辟额外空间)

2024-03-25 21:38

本文主要是介绍大数相加(不开辟额外空间),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    大数相加可以借助多种方法来实现,这里提供了一种链表节点的数据域为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<stdio.h>
#include<string.h>#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);elseprintf("Wrong\n");return 0;
}
 测试结果:

原文:http://blog.csdn.net/ns_code/article/details/25555743

这篇关于大数相加(不开辟额外空间)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846326

相关文章

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨

算法9—两个巨大正整数相加

两个巨大整数相加,可能会造成溢出,或者它的大小已经超出基本数据类型的范围,所以,我们对巨大整数进行相加时,可以把它们转换成字符串,然后通过字符串的处理进行整数相加。 这里有两种做法:第一种,把整数存在一个字符数组里进行处理。代码如下: [java]  view plain copy public static String addThroughArray(String

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

内存填充越界 + malloc空间不够导致越界

【创建时间:2014-11-1 11:50】 [2014-10-31]:环境:系统:Linux版本:3.08    平台:Hisi3516c。 内存填充越界: 问题: 申请了一个2048字节局部静态的变量存储一个固定RGB值,方便后续画框、线时快速copy。但是在第一次赋固定值时,越界了,导致内核自动向应用程序 发送信号 SIGBUS(7)给应用程序,导致应用程序异常

新建帐套提示“无法创建数据库!请检查目录…是否存在,以及系统空间是否充足.

1、在K/3安装路径下K3ERP文件夹下,找到DBFILE文件夹;2、右击单击“DBFILE”文件夹,选择“属性”→【安全】→【添加】,选择【高级】→【立即查找】→找到everyone用户;3、把该用户添加到【用户和组】中,并赋予“完全控制权限”。

基于CDMA的多用户水下无线光通信(2)——系统模型和基于子空间的延时估计

本文首先介绍了基于CDMA的多用户UOWC系统模型,并给出了多用户收发信号的数学模型。然后介绍基于子空间的延时估计算法,该算法只需要已知所有用户的扩频码,然后根据扩频波形的循环移位在观测空间的信号子空间上的投影进行延时估计。 1、基于CDMA的多用户UOWC系统模型   首先介绍基于CDMA的多用户UOWC系统模型,系统框图如下图所示。   该系统包括发送端、UOWC信道和接收端。该系统

DataStructure.时间和空间复杂度

时间和空间复杂度 【本节目标】1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例3.4.1 示例13.4.2 示例23.4.3 示例33.4.4 示例43.4.5 示例53.4.6 示例63.4.7 示例7 4.空间复杂度4.1 示例14.2 示例24.3 示例3 【本节

列表框空间JList的用法演示

package 列表框控件演示;import java.awt.Color;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.eve

java中一个对象 在内存中、数据库中、序列化后 占用的空间是一样的么

答:不一样。protobuf序列化=数据库<≈内存<json序列化 解释: protobuf序列化、数据库:都是使用了最紧凑的形式用二进制来存储对象。内存:也是使用了最紧凑的形式用二进制来存储对象,但是多了对象头的结构。json序列化:将对象转成了文本(字符串);并且为了表意清楚,每个属性都带上了属性名。 所以,现在有个趋势,注重传输效率的场景,正在用protobuf序列化代替json序列化

[第五空间2019 决赛]PWN5

参考文章: 格式化字符串漏洞原理及其利用(附带pwn例题讲解)_格式化字符串攻击教程-CSDN博客 格式化字符串漏洞原理详解_静态编译 格式化'字符串漏洞-CSDN博客 BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com) 栈溢出保护(cannary) 数据溢出保护(NX) 运行一下看看