HDU.1002 A + B Problem II
原题
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相关推荐
- Hdu - 1002 - A + B Problem II
题目: A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 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 ...
- hdu 1002 A+B problem II
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 题目分析:高精度问题,大整数相加. 由此题可见java相较于C/C++的优势,即丰富多彩的类以及 ...
- hdu 1002 A + B Problem II(大正整数相加)
代码: #include<cstdio> #include<cstring> #define Min(a,b) ((a)<(b)?(a):(b)) using names ...
- HDU - 1002 A + B Problem II(大数)
题目链接:点击查看 题目大意:大数加法 题目分析:第一次用Java写ACM,还是有点小激动滴,有几点需要注意的: 公共类名要写Main 不要提交包名 注意输入输出 上代码吧,纪念一下: import ...
- 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 ...
- HDOJ 1002 A + B Problem II 解题报告
今天研究 1002,,,搞得半死,虽说是一道简单的题目,真正做起来绝不是很容易的... A + B Problem II Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和
为题如下: Problem Description I have a very simple problem for you. Given two integers A and B, your job ...
- hdu A + B Problem II(大数相加,数组实现)
hdu A + B Problem II(大数相加,数组实现) 题目走起 注意最后一个case 不需要换行 下面代码 #include<stdio.h> #include<strin ...
最新文章
- Linux存储的基本管理
- 从源码理解Redux和Koa2的中间件机制
- 武汉网络推广浅析当网站停止收录时该检查哪些问题?
- java-两数倒置后求和
- Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
- 有些事情女孩子越早知道越容易幸福
- 最新SparkSQL 学习路径. pdf(廖雪峰团队研发)
- 一种SPA(单页面应用)架构
- 服务器虚拟化 实验,VMware vSphere服务器虚拟化实验三 安装vCenter Server
- 从三大标准衡量hypervisor
- C# winform 模拟选中并点击某一行DataGridView数据
- 用Java写一个小游戏
- 工具类——FileUtils
- inode客户端linux 怎样运行,H3C_iNode智能客户端安装指导(Linux)
- visual basic_什么是Visual Basic?
- 2018年百度算法与标准汇总
- Matlab 2019b AudioToolBox设备环境测试
- lintcode 983. 棒球游戏
- 太极图形html5代码,canvas绘制太极图的实现示例
- Flask蓝本(Blueprint)
热门文章
- php筛选怎么做,thinkphp条件筛选 例子
- 手机链接路由wifi,设置为固定IP方法
- python3.7 matplotlib增加坐标说明_python matplotlib:如何在极坐标图中的轴和刻度标签之间插入更多空格?...
- windows安装ffmpeg_免费实用的录屏工具!支持全屏、特定窗口、选定区域录制,支持添加水印、嵌入摄像头(附ffmpeg安装)...
- Android Studio中Eric常用的快捷键
- 2018今日头条春招面试题
- EC600 QuecPython接入第三方MQTT服务器, 以阿里云物联网平台为例,可替换为自己创建的MQTT服务器
- Altium的原理图主题修改为Orcad的默认样式(Altium原理图样式更改)
- 剑指offer——27.二叉树的镜像
- 【SKILLS】About the phonetics