高精度a+b

本文详细介绍了一种处理高精度加法的算法实现,通过使用数组模拟竖式计算过程,解决longlong等基本数据类型无法处理的大数运算问题。文章提供了具体的C++代码示例,包括字符串输入转换、倒序存储、进位处理及结果输出等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓“高精度”,就是两个几十甚至几百位的两个数进行四则运算。这时候long long也远远不够,所以我们要另辟蹊径——用数组模拟竖式计算。

注:网图,https://i-blog.csdnimg.cn/blog_migrate/d556ce69f092e7bb60ab9a42cb10d5e3.png

我们用两个字符串a[505],b[505]用来输入。紧接着,定义两个int数组ans1[505],ans2[505]。把a,b倒过来(因为竖式从低位到高位算)且变成int类型存在ans1,ans2中。最后定义一个int类型的ans[505],ans[i] 存ans1[i]+ans2[i]。最后逆向输出即可代码如下

#include <bits/stdc++.h>
using namespace std;
char a[505],b[505];
int ans[505],ans1[505],ans2[505];
int main()
{
	cin>>a>>b;
	int la=strlen(a); //求a的长度 。 
	int lb=strlen(b); //求b的长度。 
	for(int i=0;i<la;i++) ans1[i]=a[la-i-1]-'0'; //把a倒过来且变成int存储 。 
	for(int i=0;i<lb;i++) ans2[i]=b[lb-i-1]-'0'; //把b倒过来且变成int存储 。 
	int jw=0; //有可能出现进位,所以用jw记录 
	int maxl=max(la,lb); //若出现ans1,ans2长度不同,则取长的加数长度。因为定义在全局变量所以多余位为0。 
	for(int i=0;i<maxl;i++)
	{
		ans[i]=(ans1[i]+ans2[i]+jw)%10; //相加,若有进位%10可以保证此为为一位数。 
		jw=(ans1[i]+ans2[i]+jw)/10; //若相加大于0,则jw为1。否则为0. 
	}
	if(jw==1) cout<<1; //若最后有进位,则输出1。如:9+2=11,先输出1。 
	for(int i=maxl-1;i>=0;i--) cout<<ans[i]; //逆向输出。 
	return 0;
}

  

 

转载于:https://www.cnblogs.com/zxjhaha/p/11309539.html

在C语言中,高精度计算通常涉及到整数或大数运算,因为C标准库提供的数据类型如int、long等对于非常大的数值可能会溢出。如果需要进行精确的大数加法(a+b),可以使用自定义的数据结构来存储整数,并使用字符串操作来逐位相加。 一种常见的做法是使用数组或链表来模拟固定大小的内存块,每个内存块代表一位数字。这里是一个简单的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int digit[100]; // 假设每位最大99 int size; } BigInteger; BigInteger* addBigIntegers(BigInteger* a, BigInteger* b) { BigInteger result; result.size = 0; int carry = 0; // 按照从低位到高位的顺序比较并相加 for (int i = a->size - 1; i >= 0; --i) { int sum = a->digit[i] + b->digit[i] + carry; carry = sum / 10; result.digit[result.size++] = sum % 10; } if (carry > 0) { result.digit[result.size++] = carry; } return &result; } void printBigInteger(BigInteger* num) { printf("%d", num->size); for (int i = num->size - 1; i >= 0; --i) { printf("%d", num->digit[i]); } printf("\n"); } int main() { BigInteger a = { {5, 7, 8}, 3 }; BigInteger b = { {2, 3, 4}, 3 }; BigInteger* c = addBigIntegers(&a, &b); printBigInteger(c); // 输出:8 6 2 1 free(c->digit); free(c); return 0; } ``` 在这个示例中,我们创建了一个名为`BigInteger`的结构体,用于表示整数。`addBigIntegers`函数实现了两个大数的加法,`printBigInteger`则用于打印结果。注意这个例子假设了数字的最大位数是固定的,实际应用中可能需要动态调整数组大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值