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

大数相加可以借助多种方法来实现,这里提供了一种链表节点的数据域为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 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] = '\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;
}

测试结果:

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

时间: 2025-01-02 00:45:49

大数相加(不开辟额外空间)的相关文章

oj问题-为什么我的这个大数相加程序在oj上跑出来的结果是OLE

问题描述 为什么我的这个大数相加程序在oj上跑出来的结果是OLE #include<stdio.h>#include<string.h>int main(){ char str1[1001]str2[1001]*num1*num2*p1*p2; int ncase/*多组输入数目*/mcase=1/*输出时的第几个输出计数器*/up/*进位存储器*/len1len2len; scanf(""%d""&ncase); while(nca

c++-这个大数相加程序用了哪些算法在逻辑结构上定义了哪些算法并求流程图

问题描述 这个大数相加程序用了哪些算法在逻辑结构上定义了哪些算法并求流程图 #include #include #include #define max(a,b) (a)>(b)?(a):(b) int big_add(char*,char*,char*); int big_compare(char*,char*,int*); int is_number_string(char*); int main() { char num1[80],num2[80],num3[100]; puts("

c语言中如何把在子函数中用malloc开辟的空间传回主函数?

问题描述 c语言中如何把在子函数中用malloc开辟的空间传回主函数? 如何把在子函数中用malloc开辟的空间传回主函数? 我将指针传给子函数,但却没有将开辟的空间地址带回到主函数 解决方案 malloc返回的是函数指针.你直接返回这个指针就可以了. 如果是在参数中,那么看你的参数有没有加上引用符号.& 解决方案二: 可以通过返回值啊... "如何把在子函数中用malloc开辟的空间传回主函数? 我将指针传给子函数,但却没有将开辟的空间地址带回到主函数" 第一句我看懂了,第二

开辟网络空间安全建设的中国道路

作者:北京师范大学刑事法律科学研究院暨法学院副教授 吴沈括 2016年12月27日,经中央网络安全和信息化领导小组批准,国家互联网信息办公室发布<国家网络空间安全战略>(以下简称:<网安战略>),这是继同年11月7日<中华人民共和国网络安全法>(以下简称:<网安法>)正式颁布之后我国在网络安全领域出台的又一重大举措,呼应了<网安法>的制度规定,明确了保障网络安全的基本要求和主要目标,提出了重点领域的网络安全政策.工作任务以及相关措施. 如果说&l

WP8用户福音 OneDrive赠3GB额外空间

[TechWeb报道]3月5日消息,微软刚刚经过改版的OneDrive自上个月开放测试以来,微软承诺给予所有打开Windows phone8手机相片同步备份功能的用户额外奖励3GB的One Drive永久存储空间.令人诧异的是,很多用户早就已经得到了这3GB空间,但还有一部分用户却没有看到微软兑现承诺,现在微软承认了该问题并宣布已经修正了此错误.如果你之前或现在打开了照片同步备份功能.现在就可以检查一下是否收到了额外3GB空间的确认邮件.

用Javascript实现两个大数相加

(function(){ var addLarge = function(n1,n2){ var over = 0; var ret = ""; var len = Math.min(n1.length,n2.length); var sln1 = n1.substr(n1.length - len,n1.length ); var sln2 = n2.substr(n2.length - len,n2.length ); for(var i = len;i > 0; i--)

C++实现的一个简单两个大数相加程序!

#include <iostream> using namespace std; #define ARRAY_SIZE 50 //Enter a big number, and store it as a string into an array ch, //the size is the numbers of char. void inputNumbers(char ch[], int& size); //Reverse the elements of the array ch. v

java中大数相加怎么解决

问题描述 BigDecimal b1 = new BigDecimal(Double.toString(11111111111111111111.0)); BigDecimal b2 = new BigDecimal(Double.toString(1.0)); System.out.println(b1.add(b2)) 结果是11111111111111110001.0,为神马? 解决方案 这样就对: BigDecimal b1 = new BigDecimal("1111111111111

HDOJ1002题A + B Problem II,2个大数相加

Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines fol