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

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

相关文章

剑指offer(C++)--和为S的两个数字

题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 class Solution {public:vector<int> FindNumbersWithSum(vector<int> array,int sum) {vector<int> result;int len = array.size();if(

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

两个基因相关性CPTAC蛋白组数据

目录 蛋白数据下载 ①蛋白数据下载 1,TCGA-选择泛癌数据  2,TCGA-TCPA 3,CPTAC(非TCGA) ②蛋白相关性分析 1,数据整理 2,蛋白相关性分析 PCAS在线分析 蛋白数据下载 CPTAC蛋白组学数据库介绍及数据下载分析 – 王进的个人网站 (jingege.wang) ①蛋白数据下载 可以下载泛癌蛋白数据:UCSC Xena (xena

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *

算法9—两个巨大正整数相加

两个巨大整数相加,可能会造成溢出,或者它的大小已经超出基本数据类型的范围,所以,我们对巨大整数进行相加时,可以把它们转换成字符串,然后通过字符串的处理进行整数相加。 这里有两种做法:第一种,把整数存在一个字符数组里进行处理。代码如下: [java]  view plain copy public static String addThroughArray(String

算法8—不通过比较,找出两个数的最大值

问题: 比如:给定两个值 5和10,不通过比较,直接找出最大值。 分析: 一旦涉及到不用比较找最大值,想都不用想,一般只能通过位运算来实现。  max = a - ((a-b)&((a-b)>>31)) 或者 max = ((a+b)+|a-b|)/2 如果找最小值,我们只需把两个值相加,减去max即可。

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

SpringBoot中如何监听两个不同源的RabbitMQ消息队列

spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在同事的帮助下,成功实现了监听多个MQ。下面我给大家一步一步讲解下,也为自己做个笔记; 详细步骤: 1. application.properties 文件配置: u.rabbitmq.ad

SQL求解两个时间差 时间类型 时间值

sql 求解两个时间差 SELECTDATEDIFF( Second, '2009-8-25 12:15:12', '2009-9-1 7:18:20') --返回相差秒数 SELECTDATEDIFF( Minute, '2009-9-1 6:15:12', '2009-9-1 7:18:20') --返回相差分钟数 SELECTDATEDIFF( Day, '2009-8

Java中的两个ArrayList

1. java.util.ArrayList ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其