题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002

题目提示,相加的两个数的位数可能很大(最多可达1000位),而int最多32位,long long类型和__int64类型都是最多64位,均不能存储位数过多的数,所以现有的数据类型无法直接存储.

思路:用字符串存储输入的数字,模拟加法的过程,即相加和进位的过程.

首先,来看一下,加法以及进位的原理,以便后面[核心代码]的理解.

No.1   6 + 7 = 13——>1和3,第一位写3,进位为1

No.2   8 + 3 = 11——>11 + No.1中的进位1 = 12——>1和2,第二位写2,进位为1

No.3   9 + 0 = 9——>9 + No.2中的进位1 = 10——>1和0,第三位写0,进位为1

No.4   7 + 4 = 11——>11 + No.3中的进位1 = 12——>1和2,第四位写2,进位为1

No.5   0 + 0 = 0——>0 + No.4中的进位1 = 1——>0和1,第五为写1,没有进位,结束

由于两数的第一位没有进位可以加,所以直接是对应的两数相加,取余数就是3.从第二位开始,对应数加完之后,还要与前面的的进位的数(1或者0)相加,再取余数,才是这一位的数.

下面思考,如何写代码?

1.用字符串(string类对象)表示输入的数.

2.给定输入的两个数x和y(用string类型x和y存储),应该作如下处理

图示做了两个方面处理,(1)对齐,方便对应位置的数字进行加法运算.(2)在最前面还加了一个0,给可能存在的进位预留一个位置,例如99+1,结果的位数为3位.

3.在进行加法的时候,逆序(从低位开始)进行.

C++代码如下

#include<iostream>
#include<string>
using namespace std; #define max(a,b) (a>b?a:b)//类似于定义一个函数求二者中的较大者 int main()
{
//freopen("in.txt","r",stdin);//调试用
int T;
cin >> T;//T组数据
for(int t=1;t<=T;t++)
{
string x,y;
cin >> x >> y;//输入两个数 //结果输出时的格式控制
cout << "Case " << t << ":" << endl;
cout << x << " + " << y << " = "; int xL = x.length();//x的长度
int yL = y.length();//y的长度 if(xL<yL)//如果x的位数小,则交换,因为最后统一将结果存储在x中
{
x.swap(y);//交换内容 int len = xL;//因为后面要用到yL,所以长度也要交换
xL = yL;
yL = len;
} //到这里x一定是长度较长的那个 int L = max(xL,yL) + 1;//结果的长度为x和y的最大长度+1(此处L的值其实就是xL+1) x = '0' + x;//x的前面添加一个0 int i,j;//循环变量 for(i=yL+1;i<=L;i++)//使x和y的长度一样
y = '0' + y;//添加0 //下面开始加法运算了
int c = 0;//记录进位:c=1或者c=0
for(i=L-1;i>=0;i--)//从右边加到左边
{
int z = x[i]-'0';//获取x[i]对应的字符对应的数字,例如x[i] = '6',则x[i]-'0'就是int型的6.
int w = y[i]-'0';
int h = z + w + c;//下面三行代码是[核心代码],描述加法的过程
c = h / 10;
x[i] = h%10 + '0';
} //输出预处理:找到从什么开始没有0(去除前导0)
for(i=0;i<L;i++)
if(x[i]!='0')
break;
for(j=i;j<L;j++)//输出
cout << x[j];
cout << endl; if(t!=T)//空行
cout << endl;
} return 0;
}

上述代码,提交可以通过.

小结:

1.调试小技巧:在主函数开始写 freopen("in.txt","r",stdin);     其中in.txt为cpp文件同目录下的输入数据.

2.宏定义的使用:#define max(a,b) (a>b?a:b)   不需要写数据类型

【hdoj_1002】A+B Problem ||(大数)的更多相关文章

  1. A+B and A*B problem 大数相加 相乘 模拟

    A+B and A*B problem 大数相加 相乘 模拟 题意 给你两个数a和b,这两个数很大,然后输出这两个数相加的和,相乘的积. 解题思路 模拟,但是还是搜了搜代码实现,发现这个大佬写的是真的 ...

  2. 快速切题 sgu 111.Very simple problem 大数 开平方 难度:0 非java:1

    111.Very simple problem time limit per test: 0.5 sec. memory limit per test: 4096 KB You are given n ...

  3. 1051:A × B problem 大数相乘

    给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraimen ...

  4. A water problem 大数取余。

    A water problem Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. sdut2613(This is an A+B Problem)大数加法(乘法)

    #include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>u ...

  6. 2016中国大学生程序设计竞赛(长春) Ugly Problem 模拟+大数减法

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5920 我们的思路是: 对于一个串s,先根据s串前一半复制到后一半构成一个回文串, 如果这个回文串比s小, ...

  7. 杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过

    杭电ACM(1002)大数相加 A + B Problem II Problem DescriptionI have a very simple problem for you. Given two ...

  8. HDOJ/HDU 5686 Problem B(斐波拉契+大数~)

    Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种 ...

  9. Train Problem II(卡特兰数+大数乘除)

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

随机推荐

  1. POJ.3087 Shuffle'm Up (模拟)

    POJ.3087 Shuffle'm Up (模拟) 题意分析 给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12. 将字符串s1和s2通过一定的变换变成s12,找到 ...

  2. 链接错误 multiply defined (by misc_1.o and misc.o).

    http://www.stmcu.org/module/forum/thread-286128-1-1.html *** Using Compiler 'V5.06 (build 20)', fold ...

  3. IO多路复用之epoll(一)讲解

    网络通信中socket有自己的内核发送缓冲区和内核接受缓冲区,好比是一个水池, 当用户发送数据的时候会从用户缓冲区拷贝到socket的内核发送缓冲区,然后从 socket发送缓冲区发出去, 当用户要读 ...

  4. CollectionUtils.isEqualCollection的用法

    在使用Java的集合时,有些时候会需要比较两个集合是否相等,自己写方法其实也简单,但是既然有了好的实现,就不要自己造轮子了,只要了解这个轮子是什么原理就好了. public static boolea ...

  5. Java集合框架(set)

    set继承自collection接口,其子类和子接口如下: set的共同特性:不能添加相同的元素,通常无法记住元素添加的顺序 1.HashSet类 判断两元素相同的标准:1.equals方法返回tru ...

  6. nginx 初探 之反向代理

    首先要解释的是什么叫做反向代理? 平时我们浏览网页可以输入网址直接访问,  但如果访问国外的网站,  可能就没那么简单('中国特色'),  这时候我们需要配置一个代理服务器, 然后通过此服务器中转来访 ...

  7. Dozer 对象的"搬运工"

    前言:项目中,经常会遇到各层对象之间相互进行值传递的过程,如在数据据持久层有一持久类EntityA,在视图层可能会变为ViewA,通常情况下,这两个类的属性 名称 .类型都是一致的,   在两个对象传 ...

  8. js绑定事件和解绑事件

    在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEv ...

  9. 2017北京国庆刷题Day2 morning

    期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK ...

  10. 始终要重载toString

    本文涉及到的概念 1.重载toString方法的意义 2.两个注意事项   1.重载toString方法的意义 重载toString,返回关于当前实例的描述信息.这在调试错误,打印实例信息时,可以带来 ...