原题

HDU.1002 A + B Problem II

分类

杂题·大位整数运算

题意

计算从任意两个长度在1000以内的正整数的和。

输入/输出 要求与格式
输入内容 最开始一行开始输入样例数,对每个样例一行输入两个正整数(空格分开)
输出结果 结果为两数和
输出格式 每个案例结果第一行为"Case X:",第二行为计算结果,两个案例结果间一个空行

题解

这道题说明了整数长度在1000以内,因此,一般的long long这种系统的整数类型是不够的,我们必须得用字符串来操作。

计算的方法其实很简单,就是我们小学算加法的时候用到的【竖式计算】。

虽然方法简单,但是我们还是需要自己多举几个例子,从其中找到普遍的规律,再来编程。

多举几个例子,稍微总结一下,可以大概总结为以下三种

  • 无进位,结果位数与加数的最大位数相同
  • 有进位,结果位数与加数的最大位数相同
  • 有进位,结果位数比加数的最大位数多1

如下图所示

那么,我们需要考虑的也可以总结为以下两点:

  • 运算过程中的进位
  • 最终结果的位数

首先,我们构思一下输入,我选择的是string字符串(怎么说毕竟是系统库,有API呀)。

然后就是我们之前考虑的两个问题了。

第一个问题——计算进位。运算的时候,我们会先对齐两个加数相应的位(个位、十位、……)。对齐后,从最后一位(个位)开始对应数字相加得到一个数tmp,再将tmp/10的结果加到十位的计算中,然后最终结果的个位即为tmp%10。以后的每一位都是类似的算法,循环解决问题,对于最高位只要稍微处理一下就可以了。

第二个问题——结果位数。这个很好办,我们在计算前就先定义好一个string res用来存放结果,这个res就是两个数中最长的再往前放一个前导0,这就涉及【字符串拼接】。当计算完最后结果时,如果最大为为0,说明计算时最高位没有进位,我们可以就要把多余的前导0抹去,这就涉及【字符串截取】

(例如:12 + 999,我们就可以先暂定string res = "0999",有人也许会觉得应该设置为string res = "0000",但是实际上没有必要,因为每一位计算的结果都会不断刷新res,res的初始值根本不重要,只有其最大可能位数是最重要的)

操作 示例代码 解释
字符串拼接 string a = "0", b = "1", c = a + b; 将a在前b在后拼接成一个新字符串c
截取子串 string res = c.substr(1); 将字符串c从下标1开始(包括)截取到末尾生成一个型字符串res

题解代码

HDU(C++/G++)AC代码如下:

#include <iostream>
#include <algorithm>
#include <string>using namespace std;int main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T;string a, b;string at, bt;int cnt = 1;//接收样例数cin >> T;while (T--){//接收数据cin >> a >> b;at = a;bt = b;//长度处理——长的在上if (a.length() < b.length())swap(a, b);//数据准备int len_min = b.length();int len_max = a.length();string res = "0";res += a;int add_once;int add_next = 0;//开始计算while (max(len_min, len_max) >= 0){--len_min;--len_max;if (len_min > -1)add_once = a[len_max] + b[len_min] - 96 + add_next;else{if (len_max > -1)add_once = a[len_max] - 48 + add_next;elseadd_once = add_next;}add_next = add_once / 10;res[len_max + 1] = add_once % 10 + 48;}//去除前导0if (res[0] == '0')res = res.substr(1);//打印结果cout << "Case " << cnt << ':' << endl;cout << at << " + " << bt << " = " << res << endl;if (T)cout << endl;++cnt;}return 0;
}

评价

这道题应该算是一道模板题,大位整数的四则运算,应对这种题,最好还是写成一套靠谱的模板好一些。

补充

这道题在C++里虽然·是道模板题,但是在Java里却可以说和HDU.1000 A + B Problem几乎是一个难度级别的,因为Java中系统里的包就有BigInteger大数类,很容易操作,有兴趣的话可以去稍微了解一下。

后话

写这题的题解的时候,虽然觉得写得勉强还算详细,但是总觉得不太对劲,可能是有些段落文字太多,显得乱七八糟

HDU.1002 A + B Problem II相关推荐

  1. Hdu - 1002 - A + B Problem II

    题目: A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. HDU 1002 A + B Problem II

    ACM OJ题解目录 本题网址:https://cn.vjudge.net/problem/HDU-1002 A + B Problem II I have a very simple problem ...

  3. hdu 1002 A+B problem II

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 题目分析:高精度问题,大整数相加. 由此题可见java相较于C/C++的优势,即丰富多彩的类以及 ...

  4. hdu 1002 A + B Problem II(大正整数相加)

    代码: #include<cstdio> #include<cstring> #define Min(a,b) ((a)<(b)?(a):(b)) using names ...

  5. HDU - 1002 A + B Problem II(大数)

    题目链接:点击查看 题目大意:大数加法 题目分析:第一次用Java写ACM,还是有点小激动滴,有几点需要注意的: 公共类名要写Main 不要提交包名 注意输入输出 上代码吧,纪念一下: import ...

  6. HPU 1002 A + B Problem II【大数】

    HPU 1002 A + B Problem II[大数] A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  7. HDOJ 1002 A + B Problem II 解题报告

    今天研究 1002,,,搞得半死,虽说是一道简单的题目,真正做起来绝不是很容易的... A + B Problem II Time Limit: 2000/1000 MS (Java/Others)  ...

  8. hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和

    为题如下: Problem Description I have a very simple problem for you. Given two integers A and B, your job ...

  9. hdu A + B Problem II(大数相加,数组实现)

    hdu A + B Problem II(大数相加,数组实现) 题目走起 注意最后一个case 不需要换行 下面代码 #include<stdio.h> #include<strin ...

最新文章

  1. Linux存储的基本管理
  2. 从源码理解Redux和Koa2的中间件机制
  3. 武汉网络推广浅析当网站停止收录时该检查哪些问题?
  4. java-两数倒置后求和
  5. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
  6. 有些事情女孩子越早知道越容易幸福
  7. 最新SparkSQL 学习路径. pdf(廖雪峰团队研发)
  8. 一种SPA(单页面应用)架构
  9. 服务器虚拟化 实验,VMware vSphere服务器虚拟化实验三 安装vCenter Server
  10. 从三大标准衡量hypervisor
  11. C# winform 模拟选中并点击某一行DataGridView数据
  12. 用Java写一个小游戏
  13. 工具类——FileUtils
  14. inode客户端linux 怎样运行,H3C_iNode智能客户端安装指导(Linux)
  15. visual basic_什么是Visual Basic?
  16. 2018年百度算法与标准汇总
  17. Matlab 2019b AudioToolBox设备环境测试
  18. lintcode 983. 棒球游戏
  19. 太极图形html5代码,canvas绘制太极图的实现示例
  20. Flask蓝本(Blueprint)

热门文章

  1. php筛选怎么做,thinkphp条件筛选 例子
  2. 手机链接路由wifi,设置为固定IP方法
  3. python3.7 matplotlib增加坐标说明_python matplotlib:如何在极坐标图中的轴和刻度标签之间插入更多空格?...
  4. windows安装ffmpeg_免费实用的录屏工具!支持全屏、特定窗口、选定区域录制,支持添加水印、嵌入摄像头(附ffmpeg安装)...
  5. Android Studio中Eric常用的快捷键
  6. 2018今日头条春招面试题
  7. EC600 QuecPython接入第三方MQTT服务器, 以阿里云物联网平台为例,可替换为自己创建的MQTT服务器
  8. Altium的原理图主题修改为Orcad的默认样式(Altium原理图样式更改)
  9. 剑指offer——27.二叉树的镜像
  10. 【SKILLS】About the phonetics