HDUOJ-1002: 大数字和的计算

2 篇文章 0 订阅
2 篇文章 0 订阅

HDUOJ-1002

程序员 刷题 ACM

1. 题目: Big Number Sum (Clik Me)

2. 我的解答:

import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static String addAsBigInteger(String a, String b){
        return (new BigInteger(a)).add(new BigInteger(b)).toString();
    }
    public static void main(final String[] args) throws IOException {

        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));

        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        int caseNumber = 0;
        if (in.hasNext()) {
            caseNumber = in.nextInt();
        }
        for (int j = 0; j<caseNumber; j++) {
            if (in.hasNext()) {
                String a = in.next();
                String b = null;
                if (in.hasNext()) {
                    b = in.next();
                }
                out.printf("Case %s:\r\n", (j+1));

                if( j == caseNumber-1) {
                    out.printf("%s + %s = %s\r\n", a, b, addAsBigInteger(a, b));
                }else{
                    out.printf("%s + %s = %s\r\n\r\n", a, b, addAsBigInteger(a, b));
                }
            }
        }

        out.flush();
    }
}


3. 运行结果

运行结果

运行速度和所用的内存,和C/C++相比,完全不行。代码长度也不大行,因为Java的特色就是语法冗长。无论如何,我先做对了再说吧。

4. 解题思路

一开始的想法是自己分析字符串,每9位(因为Java Integer 是最大值是10位)一组,进行加法计算,该进位的地方加上进位。实现的时候遇到了不少问题。在后面的《遇到的问题与分析》会稍微总结一下这些遇到的问题。后来一想,为什么要自己实现呢?为什么不直接用JDK的东西呢?JDK就是Java语言的强项?虽然自己实现可以锻炼更多编程能力,考虑到我想先把做题的数量提上去,所以决定尽快解决这个问题,就直接用了Java的BigInteger。代码量还特别少。主要问题就是输出格式的问题,核心的大数加法就交给JDK吧!

5. 遇到的问题,分析与经验:

5.1 Math.ceil(intA/intB)

类库用法错误。显然ceil操作是面向double的,所以一定要想办法让参数转为double: Math.ceil(intA/(double)intB)。
经验就是,整数除法一定要小心。整数除法是计算机所不擅长的。

5.2 在算进位的时候,遇到溢出

考虑如下代码,

        int a=(int)1E10;
        System.out.println(a);


你认为会输出啥呢?编译器会报错吗?
编译器不会报错,输出时2147483647。这个数字就是传说中的Integer.MAX_VALUE. 原因其实大家都懂。问题是为什么编译器不做检查呢?为什么呢?

5.3 System.out.println()与System.out.print("\n")的区别

在windows平台上, println会输出 "\r\n", 但是print("\n")当然只会输出"\n". OnlineJudge平台会区别对待这两种换行,这货只认"\r\n"。否则,这货会抱怨Presentation Error.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值