杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过
杭电ACM(1002)大数相加
A + B Problem II
Problem Description
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases.
Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large,
that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
Output
For each test case, you should output two lines. The first line is "Case #:",
# means the number of the test case. The second line is the an equation "A + B = Sum",
Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.
Sample Input
2
1 2
112233445566778899 998877665544332211
Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
/*
大数相加----格式完全正确版
Problem Description
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases.
Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large,
that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
Output
For each test case, you should output two lines. The first line is "Case #:",
# means the number of the test case. The second line is the an equation "A + B = Sum",
Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.
Sample Input
2
1 2
112233445566778899 998877665544332211
Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
分析,因为两数都超过了整型数的表数范围,因此在处理时,用字符数组分别来存放两个大数
然后再处理。处理时,要将数字字符和对应数字进行转换,并要考虑对应位上求和有进位的情况。
处理时要考虑几种情况
(1) 1+223 (串长度不同,不产生最高位进位)
(2) 223+1
(3) 111+222 (串长度相同,但不产生最高位进位)
(4) 1+999 (串长度不同,产生最高位进位)
(5) 999+1
(6) 199+1 (串长度不同,但不产生最高位进位)
(7) 1+199
(8) 999+222 (串长度相同,但产生最高位进位)
因此求和的数组长度一定要比两个串中较长的那个串长多1,因为要存放最高位进位
一种方法可以利用第3个数组,但为了节省空间,我们可以用第二个数组来存放求和结果
因为我们是从第二个串的最后一个位置再往后一个位置开始存放,
所以在依次求和中并不能影响还没用到的位上的数字
*/
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
]; //存放第一个字符串
]; //存放第二个字符串,并存放两个串的和
int case_N; //存放case个数
int length_a; //获取第一个串的长度
int length_b; //获取第二个串的长度
char *p_a; //指向第一个串的指针
char *p_b; //指向第二个串的指针
char *p_s; //指向第二个串的指针,存放结果
int sum; //存放两个数对应位上的两个数字之和
; //存放下一次计算是否有上次的进位
int i; //循环控制变量
cin>>case_N;
;i<=case_N;i++) //用循环完成case_N次两个大数相加
{
flag=;
cout<<"Case "<<i<<":"<<endl;
cin>>a>>b;
length_a=strlen(a); //获取第一个串的长度
length_b=strlen(b); //获取第二个串的长度
p_a=a+length_a-; //指针指向第一个串的最后
p_b=b+length_b-; //指针指向第二个串的最后
cout<<a<<" + "<<b<<" = ";
p_s=b+(length_a>length_b?length_a:length_b)+; //指针指向第二个串的最后再往后两个位置,用来指向要存放的和(和要比连个两个串中的较长的那个串还多1个,因为存在进位)
*p_s='\0'; //最后一个位置放字符串结束标记
p_s--; //p_s前移
//计算求和,从各自的个位往前递增相加
while(p_a>=a&&p_b>=b) //如果两个串对应的指针都没有到各自串的第一个位置
{
sum=*p_a-'+flag; //因为是字符数组,因此要进行字符对应数字的转换,并且要加上上一次相加的进位flag(0或1)
) //对应位上数字和大于10则存在进位
{ flag=; //进位1
*p_s=sum-+'; //对应位上和减10获取对应位上数字,再转换为对应数字字符存放到数组中
}
else
{
flag=; //不进位0
*p_s=sum+';
}
p_a--;
p_b--;
p_s--;
}
) //如果第一个串中数字从地位到高位都加完了
{
while(p_b>=b) //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
{
sum=*p_b-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_b--;
p_s--;
}
}
else //如果第二个串中数字从地位到高位都加完了
{
while(p_a>=a) //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
{
sum=*p_a-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_a--;
p_s--;
}
}
) //如果最后一次相加无进位
cout<<p_s+; //从第二个数组中的第二个位置开始输出,即为求和结果
else //如果最后一次相加有进位,则把进位1,存放到第二个数组中的第一个位置
{
*p_s='; //则把进位'1',存放到第二个数组中的第一个位置
cout<<p_s; //从第二个数组中的第一个位置开始输出,,即为求和结果
}
if(i==case_N)
cout<<endl;
else
cout<<endl<<endl; //两个case之间有空行隔开
}
;
}

以下程序是就完成一次两个大数相加
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
]; //存放第一个字符串
]; //存放第二个字符串,并存放两个串的和
int sum; //存放两个数对应位上的两个数字之和
; //存放下一次计算是否有上次的进位
cin>>a>>b;
int length_a=strlen(a); //获取第一个串的长度
int length_b=strlen(b); //获取第二个串的长度
; //指针指向第一个串的最后
; //指针指向第二个串的最后
cout<<a<<" + "<<b<<" = ";
; //指针指向第二个串的最后再往后两个位置,用来指向要存放的和(和要比连个两个串中的较长的那个串还多1个,因为存在进位)
*p_s='\0'; //最后一个位置放字符串结束标记
p_s--; //p_s前移
//计算求和,从各自的个位往前递增相加
while(p_a>=a&&p_b>=b) //如果两个串对应的指针都没有到各自串的第一个位置
{
sum=*p_a-'+flag; //因为是字符数组,因此要进行字符对应数字的转换,并且要加上上一次相加的进位flag(0或1)
) //对应位上数字和大于10则存在进位
{ flag=; //进位1
*p_s=sum-+'; //对应位上和减10获取对应位上数字,再转换为对应数字字符存放到数组中
}
else
{
flag=; //不进位0
*p_s=sum+';
}
p_a--;
p_b--;
p_s--;
}
) //如果第一个串中数字从地位到高位都加完了
{
while(p_b>=b) //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
{
sum=*p_b-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_b--;
p_s--;
}
}
else //如果第二个串中数字从地位到高位都加完了
{
while(p_a>=a) //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
{
sum=*p_a-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_a--;
p_s--;
}
}
) //如果最后一次相加无进位
cout<<p_s+<<endl; //从第二个数组中的第二个位置开始输出,即为求和结果
else //如果最后一次相加有进位,则把进位1,存放到第二个数组中的第一个位置
{
*p_s='; //则把进位'1',存放到第二个数组中的第一个位置
cout<<p_s<<endl; //从第二个数组中的第一个位置开始输出,,即为求和结果
}
;
}
以下程序用了三个数组实现一次两个大数相加
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
];
];
]={'\0'};
int sum;
;
cin>>a>>b;
cout<<a<<" + "<<b<<" = ";
int length_a=strlen(a);
int length_b=strlen(b);
;
;
char *p_s=s+(length_a>length_b?length_a:length_b);
while(p_a>=a&&p_b>=b)
{
sum=*p_a-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_a--;
p_b--;
p_s--;
}
)
{
)
{
sum=*p_b-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_b--;
p_s--;
}
}
else
{
)
{
sum=*p_a-'+flag;
)
{ flag=;
*p_s=sum-+';
}
else
{
flag=;
*p_s=sum+';
}
p_a--;
p_s--;
}
}
)
cout<<p_s+<<endl;
else
{
*p_s=';
cout<<p_s<<endl;
}
;
}
杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过的更多相关文章
- 杭电acm 1002 大数模板(一)
从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...
- 杭电ACM 1002题
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(S ...
- 杭电ACM刷题(1):1002,A + B Problem II 标签: acmc语言 2017-05-07 15:35 139人阅读 评
最近忙于考试复习,没有多少可供自己安排的时间,所以我利用复习之余的空闲时间去刷刷杭电acm的题目,也当对自己编程能力的锻炼吧. Problem Description I have a very si ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 杭电ACM题单
杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...
- HDU 1002 A + B Problem II(高精度加法(C++/Java))
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 杭电acm习题分类
专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...
- 2017杭电ACM集训队单人排位赛 - 6
2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...
- 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)
数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. while (a) //将每位数字取出来, ...
随机推荐
- Js 对象二
一.Date对象 1.创建Date对象的方法 1)使用new关键字和Date类来创建(不带参数) Var today = new Date(); //不带参数 它是获取当前的系统时间 2)使用new关 ...
- VS 2013的初配置
首先,安装vs2013,安装过程比较简单,也已有教程,在此不赘述.只想说一下,vs2013需要占C盘比较大的空间:所有功能都安装,且装在C盘的话,约需要9G左右,即使安装在其他盘,也需要占C盘6G左右 ...
- 一个简单的CS系统打包过程图文版
一个简单的CS系统打包过程图文版 1. 打包内容 1.1. 此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...
- Ueditor中增加迅雷下载支持
在项目中有遇到需要在Ueditor中加一个链接,迅雷的开头是thunder 会被默认加上http:// 最后的 结果就变成了http://thunder://xxxxx 导致用户点击失败: 其实在 ...
- 真正的inotify+rsync实时同步 彻底告别同步慢
真正的inotify+rsync实时同步 彻底告别同步慢 http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景 我们公司在用in ...
- HTML 中的字符集、ASCII、 ISO-8859-1、符号之间的关系和 HTML URL 编码注意的事项
一.HTML 实体 1.什么是HTML 实体? 在 HTMl 中,某些字符是保留的.小于号 (<) 和 大于号 (>), 浏览器会误认为是标签 如果希望正确地显示预留字符,必须在 HTML ...
- MySQL查询LIKE如何匹配下划线 通配符转义
MySQL查询时使用LIKE匹配下划线,您会发现连查询“%A_B%”时会出现“%A B%”和“%AB%”也查询出来了,这是因为下划线也被当作特殊字符,做了任意匹配转换了,所以,要想匹配下划线,那么就需 ...
- php学习日志(2)-php变量
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变量(例如:$x=$y+$z).变量的定义主要有以下规则: 变量以$开始,后面跟着变量的名称: 变量名 ...
- CentOS6.5 MySQL 配置设置总结笔记
三.登录MySQL 登录MySQL的命令是mysql, mysql 的使用语法如下: mysql [-u username] [-h host] [-p[password]] [dbname] u ...
- SDP协议分析
一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...