【c++】大数相加

在实现简单的加法时,我们大都会采用直接相加输出结果,但是如果两个数非常大,已经超出了c++基本数据类型的表示范围时,该如何解决?

c++几种基本数据类型:

int             整型 		4字节 范围:-2147483648 ~ 2147483647
float         	实型(单精度) 	4字节 范围:1.18*10@-38 ~ 3.40*10@38    7位有效位(多少次方符号不能显示,以@代替,下同
double     	实型(双精度) 	8字节 范围:2.23*10@-308 ~ 1.79*10@308  15位有效位
可见,如果需要计算大数相加,这些基本类型能力也有限。

现提供一种方法解决大数相加,基于String字符串,大家都知道,String可以表示很长的字符,String 的长度可以是零个字符至大约二十亿个字符。将需要相加的数存为String类型,在想办法将两个数相加即可解决问题。如果学过数据结构,可以有更好的解决方法,如尝试使用链表等可以解决问题,大数相乘等,同样可以使用链表等数据结构解决。

示例:计算123456789987654321+987654321012345 = ?时,先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,所以如果将其中的数字直接相加,其实是不对的如,如上述问题,中末尾分别为1和5,如果直接相加,则是字符在相加如:

string a1 = "1";
string a2 = "5";
cout<<a1 + a2<<endl;

输出结果为:


很显然这不是我们需要的答案,我们想要的是1+5=6;

这里有一个解决方法:在计算的时候将每一个数都减去字符‘0’,这样得到的即为我们需要的数。

c++代码如下:

#include <iostream>
#include <string>

using namespace std;

void main()
{
	string a1 ;
	string a2 ;
	cout<<"请输入需要相加的两个大数:"<<endl;
	cout<<"加数:"<<endl;
	cin>>a1;
	cout<<"被加数:"<<endl;
	cin>>a2;
	
	string res;
	int OneAdd = 0;//
	int temp2  = 0;//
	int temp   = 0;
	int min    = a1.length()<a2.length() ? a1.length() : a2.length();//比较两个字符串,取较小一个的长度

	for(int i=1; i<=min; i++)
	{
		OneAdd = (a1[a1.length() - i] - '0' + a2[a2.length() - i] - '0') + temp;
		temp = OneAdd/10;			//需要向前一位的数,如9+8=17,进一位:1
		temp2 = OneAdd % 10;		//需要保留的,如9+8=17,保留7
		res.push_back(temp2 + '0');	//将每次保留的数存入结果字符串,注意顺序是反的,结果需倒置输出
	}

	//将余下的直接添加到结果,注意前面可能前进一位
	while(a1.length() > min)
	{
		OneAdd = a1[a1.length()-1 - min] - '0' + temp;
		temp = OneAdd/10;			
		temp2 = OneAdd % 10;
		res.push_back( temp2 + '0' );
		min++;
	}
	while(a2.length() > min)
	{
		OneAdd = a2[a2.length() - 1 - min] - '0' + temp;
		temp = OneAdd / 10;
		temp2 = OneAdd % 10;
		res.push_back( temp2 + '0' );
		min++;
	}

	//将res反向输出
	cout<<"结果:"<<endl;
	for(int i=res.length()-1; i>=0 ;i--)
	{
		cout<<res[i];
	}
	cout<<endl;
}
如有疑问请留言!
附上源代码链接: http://download.csdn.net/detail/shanchuan2012/6977551
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: #include <stdio.h>int main() { int a, b, sum; printf("请输入第一个数字: "); scanf("%d", &a); printf("请输入第二个数字: "); scanf("%d", &b); sum = a + b; printf("它们之和为: %d", sum); return 0; } ### 回答2: C语言中可以使用字符数组来实现大数相加的算法。算法的基本思路是将大数按照逆序存储在两个字符数组中,然后依次相加对应位置上的数字,并考虑进位的情况。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <string.h> void bigNumAdd(char num1[], char num2[], char result[]) { int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 : len2; // 结果数组的长度为较长的输入数字的长度 int carry = 0; // 进位 for (int i = 0; i < len; i++) { int sum = carry; // 当前位置上的数字等于进位值 if (i < len1) { sum += num1[i] - '0'; // 将字符转换为数字 } if (i < len2) { sum += num2[i] - '0'; // 将字符转换为数字 } carry = sum / 10; // 计算进位值 result[i] = sum % 10 + '0'; // 将结果存入结果数组 } if (carry > 0) { result[len] = carry + '0'; // 如果最高位有进位,将进位值存入结果数组 result[len + 1] = '\0'; // 结果数组末尾加上字符串结束标志 } else { result[len] = '\0'; // 结果数组末尾加上字符串结束标志 } } int main() { char num1[] = "12345678901234567890"; char num2[] = "98765432109876543210"; char result[41]; // 最终结果数组的长度为较长的输入数字的长度+1 bigNumAdd(num1, num2, result); printf("结果: %s\n", result); return 0; } ``` 该示例代码中,输入的两个大数分别为"12345678901234567890"和"98765432109876543210",结果为"111111111111111111100"。 ### 回答3: 下面是一个用C语言编写的大数相加的算法: ```c #include<stdio.h> #include<string.h> void addBigNumbers(char num1[], char num2[], char result[]) { int len1 = strlen(num1); int len2 = strlen(num2); int biggerLength = len1 > len2 ? len1 : len2; int carry = 0; // 进位 int i, j, k; i = len1 - 1; j = len2 - 1; for (k = 0; k <= biggerLength; k++) { int n1 = i >= 0 ? num1[i] - '0' : 0; int n2 = j >= 0 ? num2[j] - '0' : 0; int sum = n1 + n2 + carry; result[k] = sum % 10 + '0'; carry = sum / 10; i--; j--; } if (result[biggerLength] == '0') { result[biggerLength] = '\0'; biggerLength--; } // 翻转结果 for (i = 0, j = biggerLength; i < j; i++, j--) { char temp = result[i]; result[i] = result[j]; result[j] = temp; } } int main() { char num1[100], num2[100], result[101]; printf("请输入第一个大数字:"); scanf("%s", num1); printf("请输入第二个大数字:"); scanf("%s", num2); addBigNumbers(num1, num2, result); printf("结果是:%s\n", result); return 0; } ``` 这个算法可以实现输入两个大数,然后返回它们相加的结果。具体实现思路是从最低位开始逐位相加,如果相加结果超过了9,则将进位标记为1,下一位相加时加上进位。最后根据进位情况和结果数组的长度进行处理,最终得到相加结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值