两个大数(包括负数)相加

2024-03-29 13:58

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

分析:

当这两个大数为正数时,我们可以将字符转化为数字相加,再加进位talg,有进位为1,否则为0;

两个为负数则与正数相似,为一正一负时,我们可以将它们转化为两个正数,用大的减去小的,然后在根据较大的数为正或负,为正时,则结果为正,否则为负。

代码如下:


<span style="font-size:18px;">#include<iostream>
#include<string>
#include<algorithm>using namespace std;</span>
<span style="font-size:18px;">//两个正数相加</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">,isPositive是结果的正负</span><span style="font-size:18px;">
string addPositiveNum(string num1,string num2,bool isPositive)
{int i=num1.size()-1;int j=num2.size()-1;int talg=0;int sum;char pt;string str="";while(i>=0&&j>=0){sum=num1[i]-'0'+(num2[j]-'0')+talg;if(sum>9){talg=1;sum=sum%10;}else{talg=0;}str.append(1,sum+'0');i--;j--;}while(i>=0){if(talg>0){sum=num1[i]-'0'+talg;if(sum>9){talg=1;sum=sum%10;}else{talg=0;}str.append(1,sum+'0');i--;}else{str.append(1,num1[i]);i--;}}while(j>=0){if(talg>0){sum=num2[j]-'0'+talg;if(sum>9){talg=1;sum=sum%10;}else{talg=0;}str.append(1,sum+'0');j--;}else{str.append(1,num2[j]);j--;}}if(talg>0){str.append(1,'1');}if(!isPositive){str.append(1,'-');}reverse(str.begin(),str.end());return str;
}</span>
<span style="font-size:18px;">//两个正数相减</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">,isPositive是结果的正负</span><span style="font-size:18px;">
string minusPositiveNum(string num1,string num2,bool isPositive)
{int i=num1.size()-1;int j=num2.size()-1;string str;if(i<j||(i==j&&num1.compare(num2)<0)){str=num2;num2=num1;num1=str;}int talg=0;int sum;str="";while(i>=0&&j>=0){sum=num1[i]-'0'-(num2[j]-'0')+talg;if(sum<0){talg=-1;sum=sum+10;}else{talg=0;}str.append(1,sum+'0');i--;j--;}while(i>=0){if(talg<0){sum=num1[i]-'0'+talg;if(sum<0){talg=-1;sum=10+sum;}else{talg=0;}str.append(1,sum+'0');i--;}else{str.append(1,num1[i]);i--;}}while(j>=0){if(talg<0){sum=num2[j]-'0'+talg;if(sum<0){talg=-1;sum=10+sum;}else{talg=0;}str.append(1,sum+'0');j--;}else{str.append(1,num2[j]);j--;}}if(!isPositive){str.append(1,'-');}reverse(str.begin(),str.end());return str;
}
string add(string num1,string num2)
{if(num1.size()<=0||num2.size()<=0)return "";bool isPositive=true;string result;if(num1[0]=='-'&&num2[0]=='-'){</span>
<span style="font-size:18px;">        //为两个负数相加,去掉‘-’号result=addPositiveNum(num1.substr(1,num1.size()-1),num2.substr(1,num2.size()-1),false);}else if(num1[0]!='-'&&num2[0]!='-'){</span>
<span style="font-size:18px;">        //为两个正数相加,result=addPositiveNum(num1,num2,true);}else{</span>
<span style="font-size:18px;">        //为一正一负string str1;string str2;</span>
<span style="font-size:18px;">        //去掉其中的‘-’号if(num1[0]=='-'){str1=num1.substr(1,num1.size()-1);str2=num2;}else{str1=num1;str2=num2.substr(1,num2.size()-1);}</span>
<span style="font-size:18px;">        //判断结果的正负int t=str1.size()-str2.size();if(t==0){int t1=str1.compare(str2);if(t1<0)t=-1;else if(t1>0)t=1;}</span>
<span style="font-size:18px;">        //两个数相等if(t==0){return "0";}</span>
<span style="font-size:18px;">       //两个正数相减if(num1[0]=='-'){if(t<0){result=minusPositiveNum(str1,str2,true);}else{result=minusPositiveNum(str1,str2,false);}}else{if(t<0){result=minusPositiveNum(str1,str2,false);}else{result=minusPositiveNum(str1,str2,true);}}}return result;
}int main()
{cout<<add("45430543","-10")<<endl;return 0;
}</span>


这篇关于两个大数(包括负数)相加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

javaScript日期相加减例子

当前时间加上2天 var d = new Date(“2015-7-31”); d.setDate(d.getDate()+2); var addTwo=d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”; “控制台输出===============”+”当前日期加2天:”+addTwo; 使用这种方法,月份也会给你计算.

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。