编程的50种基础算法_C++编程基础算法高精度加法

计算需求与C++现状阐述:

在c++中,整型变量有int和long long 。int类型占4个字节,也就是能表示到2的32次方,对应的为10的9次方数量级,,long long类型占8个字节,也就是能表示到2的64次方,对应的为10的18次方数量级,那么如果给定的数字已经远远大于这个数量级,c++中原有的数字变量类型就不够用了,那怎么办呢?

988d89158c2dbbbf182f5e720d61baf0.png

解决方法:

用字符数组模拟大整数的运算,统称高精度运算。

高精度算法现状:

竞赛当中考得较少,目前java和python语言中,都可以直接模拟出高精度算法,那为什么要学呢?

没说一定要学,不会也不影响,高精度运算的底层逻辑就是数学中运算的逻辑,学会了,编码的实现能力肯定能上一层楼。

算法核心:

1.将大整数保存成字符数组后,再转成数字数组。为了方便计算(计算从个位开始,但是保存的字符数组第一位却是最高位),数字数组为逆序。

2.进位需要考虑到。

3.为了申请数组长度的方便,a+b=c,其中a,b,c均定义成动态数组。动态数组自带push_back()意思是数组入栈,size()函数是测量数组的长度。

 f92c1e68cdf1d903f5daf0c73f40fef7.png

边界条件考虑:

1.定义tmp变量来保存每位上a与b的相加,tmp的个位数加到c数组,十位数为进位。

2.前置零的情况,比如0001+0002=0003,不能输出0003,只能输出3。对于这种情况用一个变量标记一下就行了。

 9c4725654bbc652e99afb6904d316e94.png

代码:

#include

#include

#include

using namespace std;

vector add(vector &a,vector &b)//加法

{

vector c;

int tmp=0;//定义tmp变量保存临时的相加数,看到tmp变量就应该知道这就是个备胎

for(int i=0;i

{

if(i

if(i

c.push_back(tmp%10);//个位数取余加到c数组当中去

tmp/=10; //tmp只取十位数,保存下一位的进位

}

if(tmp) c.push_back(tmp);//如果tmp变量最后不为0,说明两数相加,位数比以前多一位,所以也要加上c数组当中去。

return c;

}

int main()

{

string m,n;

vector a,b,c;//定义动态数组

cin>>m>>n;

for(int i=m.length()-1;i>=0;i--)//从个位开始将字符转置到数字

a.push_back(m[i]-'0');

for(int i=n.length()-1;i>=0;i--)//从个位开始将字符转置到数字

b.push_back(n[i]-'0');

c=add(a,b);

int tmp=0;//tmp赋初值等于0

for(int i=c.size()-1;i>=0;i--)

{

if(c[i]!=0||i==0) tmp=1;//利用tmp来去掉前置0的情况

if(tmp)

 cout<

}

return 0;

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++比赛中的高精度加法是指在进行大数相加时,使用一特殊的算法来处理超过普通数据类型范围的数字。这算法可以处理任意长度的整数,而不会丢失精度。 在C++中,可以使用字符串或数组来表示大数,并通过模拟手工计算的方式进行加法运算。以下是一个简单的示例代码: ```cpp #include <iostream> #include <string> #include <algorithm> std::string add(const std::string& num1, const std::string& num2) { std::string result; int carry = 0; int i = num1.length() - 1; int j = num2.length() - 1; while (i >= 0 || j >= 0 || carry > 0) { int digit1 = (i >= 0) ? num1[i--] - '0' : 0; int digit2 = (j >= 0) ? num2[j--] - '0' : 0; int sum = digit1 + digit2 + carry; carry = sum / 10; result.push_back(sum % 10 + '0'); } std::reverse(result.begin(), result.end()); return result; } int main() { std::string num1 = "123456789"; std::string num2 = "987654321"; std::string sum = add(num1, num2); std::cout << "Sum: " << sum << std::endl; return 0; } ``` 在上述代码中,我们定义了一个`add`函数,接受两个大数字符串作为参数,并返回它们的和。我们使用两个指针`i`和`j`分别指向两个字符串的末尾,然后从末尾开始逐位相加,并将结果保存在`result`字符串中。如果相加的结果超过了10,我们将进位保存在`carry`变量中,并在下一位相加时加上进位。最后,我们将`result`字符串反转得到最终的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值