一、Description

The creators of a new programming language D++ have found out that whatever limit for SuperLongInt type they make, sometimes programmers need to operate even larger numbers. A limit of 1000 digits is so small... You have to find
the sum of two numbers with maximal size of 1.000.000 digits.

Input

The first line of an input file contains a single number N (1<=N<=1000000) - the length of the integers (in order to make their lengths equal, some leading zeroes can be added). It is followed by these integers written in columns.
That is, the next N lines contain two digits each, divided by a space. Each of the two given integers is not less than 1, and the length of their sum does not exceed N.

Output

Output file should contain exactly N digits in a single line representing the sum of these two integers.



二、问题分析



题目看了几遍,硬是没看懂。后来找到翻译,才知道题意,花了我老鼻子劲了。

问题:

一个新的程序语言D++的创造者发现不论如何设计超长整数的范围,有些时候程式设计师还是需要运算更大的数值。1000位的限制太小了,你现在要对两个长度最多有1000000位的整数做加法运算。

Input

输入的第一列有一个整数N,代表接下来有几组测试资料。

每一组测试资料的开头有一整数M(1<=M<=1000000),表示要相加的两个数的长度。为了令两个数字的长度相等,较短的数字开头会补上一连串的0。

接下来的M列每一列会有两个字元,以空白键作区格,要相加的两个数会以直行的方式表示。拿以下Sample Input为例,要相加的数值分别为4287+0​​463与098+372。

Output

对每一组输入印出相加后的结果,每个结果之间请空一行。

分析:1000000的大数相加,我们的整形是不能承受的。而且此题的数据非常强大,对时间的要求又很严格。由于输入是从高位到地位,因此我们从低位开始计算,并且我们就必须马上算出这个位元的和。又如果发生进位,则把进位值往上一位丢,但是我们不知道进位之后的前一位是否还会再发生进位,因此要一直往前追踪到没有进位发生为止,才能读入下一列的测资。以本题的测资量,若是打算将每一位元的和计算出来后才从最后一位开始往前寻找进位则会超过时间限制。因此仍然不能全部加完之后才处理进位,必须在发生进位时就要马上处理。用Java借此题是要注意用BufferedInputStream将输入读入字节数组。在这里要特别注意索引的值得变化以及'/r'
,'/n' 各占一个字节
。读取进来的字节用ASCII码表示,用于计算时要减48(0的Ascii码)。而输出则是输出字节数组,因此要加48转换成ASCII.

import java.io.BufferedInputStream;
import java.io.IOException; public class Main { public static void main(String[] args) throws NumberFormatException,IOException {
BufferedInputStream read = new BufferedInputStream(System.in);
byte[] b = new byte[5000000];
read.read(b);
String s = "";
int index = 0;
while (b[index] != '\r') {
s += (char) b[index];
index++;
}
int n = Integer.parseInt(s);
byte[] c = new byte[n];
for (int i = 0; i < n; i++) {
index++;
index++;
c[i] += b[index] - 48;
index++;
index++;
c[i] += b[index] - 48;
index++;
}
int cf = 0;
for (int i = n - 1; i >= 0; i--) {
c[i] += cf;
cf=c[i]/10;
c[i]=(byte)(c[i] %10 +48); }
System.out.write(c);
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Poj 2602 Superlong sums(大数相加)的更多相关文章

  1. POJ 1503 Integer Inquiry(大数相加)

    一.Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his exp ...

  2. Poj OpenJudge 百练 2602 Superlong sums

    1.Link: http://poj.org/problem?id=2602 http://bailian.openjudge.cn/practice/2602/ 2.Content: Superlo ...

  3. POJ 1503 Integer Inquiry(大数相加,java)

    题目 我要开始练习一些java的简单编程了^v^ import java.io.*; import java.util.*; import java.math.*; public class Main ...

  4. hdu acm-1047 Integer Inquiry(大数相加)

    Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. UVa 424 Integer Inquiry 【大数相加】

    解题思路:因为给定的数据是多组,所以我们只需要多次做加法就可以了,将上一次的和又作为下一次加法运算的一个加数. 反思:还是题意理解不够清楚,最开始以为只是算三个大数相加,后来才发现是多个,然后注意到当 ...

  6. 用字符串模拟两个大数相加——java实现

    问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...

  7. 随机数组&大数相加

    随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中 一,      设计思路: 先生成随机数数组,再将数组保存在一个字符串中,然后将数组各数字加和, ...

  8. java-两个大数相加

    题目要求:用字符串模拟两个大数相加. 一.使用BigInteger类.BigDecimal类 public static void main(String[] args) { String a=&qu ...

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

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

随机推荐

  1. 九度OJ 1181:遍历链表 (链表、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2733 解决:1181 题目描述: 建立一个升序链表并遍历输出. 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1 ...

  2. Mysql 学习1

      Mysql学习   一.数据库   1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: 可存储大量数据: 方便检索: 保持数据的一致性.完整 ...

  3. C#基础知识之三

    C#基础知识之三 1.  程序集间的继承:基类必须被声明为public.必须在project中包含对该基类的程序集引用. 2.  对其它程序集引用和添加对using指令的差别:前者是告诉编译器所需的类 ...

  4. emmet缩写格式

    2016年5月30日 10:10 标准网页<!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...

  5. LATEX ——WinEdt 破解

    WinEdt 是目前我发现最好的LaTeX编辑器,但是在国内支付不便,且学生许可需$40,只能出此下策,望有余力者尽量购买正版. WinEdt 的旧版本的破解方法众所周知,只需定时删除HKCU\Sof ...

  6. SAP 改表方法

    SAP中直接修改表.视图的Tcode有SE16N和SM30. 1. SE16N修改表需要先输入命令&SAP_EDIT,回车左下角显示激活SAP编辑功能后,就可以对相应的表进行新增.删除.修改的 ...

  7. gsub! 和 gsub

    ruby中带“!"和不带"!"的方法的最大的区别就是带”!"的会改变调用对象本身了.比方说str.gsub(/a/, 'b'),不会改变str本身,只会返回一个 ...

  8. Java多线程系列 JUC线程池03 线程池原理解析(二)

    转载  http://www.cnblogs.com/skywang12345/p/3509954.html  http://www.cnblogs.com/skywang12345/p/351294 ...

  9. mysql 数据库备份方案及策略

    由于mysql存在多种数据库备份方式,而且各有利弊,对于我们初学者来说,选择合适的备份方式确实有些困难.个人觉得,首先要基于公司的需求,考虑能够容忍丢失多少数据.花多少人力时间成本等,这是我们制定备份 ...

  10. codeforces 60B bfs

    题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满. 思 ...