HDOJ 1002A + B Problem II求和问题(二)

本文介绍了一道ACM竞赛中的大数加法问题,并详细记录了使用Java编程语言解决该问题的过程,包括如何利用BigInteger类进行运算及提交代码时遇到的输出格式错误等问题。

0x00 前言

一看这道题,做大整数的加法,C语言中比较经典的题,没有几十行代码是解决不了的。不过用Java来写,里面有个BigInteger类专治这种牛皮藓,简直是分分钟搞定的送分题啊 <( ̄▽ ̄)> 哇哈哈…等下,提交的前两次显示Presentation Error 输出格式错误 这是什么鬼?查了下,一般是多了或者少了一些空格或者空行。好吧,继续改,不过AC结果有点出乎意料。。。
在线编程调试 http://www.dooccn.com/c/
Sum Problem II原题 http://acm.hdu.edu.cn/showproblem.php?pid=1002

0x01 题目

Sum Problem II
这道题要求输入整数T(1<=T<=20),接着输入T行测试案例,每行是两个大整数(每个长度范围不超过1000)。

0x02 错误格式1

注意使用Java编译器,要在Main类的main方法里写代码,记得引入包路径。

import java.math.BigInteger;
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int i=0;
        int T=cin.nextInt();
        while(++i<=T) {
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            System.out.println("Case "+i+":\n"+a+" + "+b+" = "+a.add(b));
            if(i!=T) {
                System.out.println();
            }
        }
    }
}

测试输出:

Case 1:
1 + 2 = 3Case 2:┘
112233445566778899 + 998877665544332211 = 1111111111111111110

(此处表示回车)
提交代码,Presentation Error!回去审题,每个测试案例之间有换行、然后输出空行,最后一行不用输出空行。嗯,都满足要求,就开始猜测了,难道是最后一行不用换行?那么就有了下面的代码。

0x03 错误格式2

import java.math.BigInteger;
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int i=0;
        int T=cin.nextInt();
        while(++i<=T) {
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            System.out.print("Case "+i+":\r\n"+a+" + "+b+" = "+a.add(b));
            if(i!=T) {
                System.out.println("\r\n");
            }
        }
    }
}

测试输出:

Case 1:
1 + 2 = 3Case 2:┘
112233445566778899 + 998877665544332211 = 1111111111111111110

这次的代码,最后一行少输出一个回车。还是Presentation Error
至于为什么某个槽点写法变了,完全是第一次手快第二次强迫症使然。开始还不相信,怀着半信半疑的态度买来。。哦不,提交试了下,效果杠杠的 ▄︻┻═┳一

0x04 最终AC代码

试了第三次才AC,大家一定没想到是这个的坑。。。

import java.math.BigInteger;
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int i=0;
        int T=cin.nextInt();
        while(++i<=T) {
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            System.out.println("Case "+i+":\r\n"+a+" + "+b+" = "+a.add(b));
            if(i!=T) {
                System.out.println();
            }
        }
    }
}

嗯,你没看错\r\n\n 。。。冏rz

\n 为ASCII的0x0A 换行,进入下一行
\r 为ASCII的0x0D 回车,打印头回到行首上
Windows中,换行用\r\n表示,\r只回车不换行
Linux下换行用\n表示
更多资料参考
http://blog.csdn.net/yafeng_jiang/article/details/7103497
http://blog.csdn.net/stpeace/article/details/45767245

那么,我可以猜测HDOJ的Java编译器坐落在Windows系统里?( ̄︶ ̄)↗
看了下网页返回数据:
HDOJ系统
首页服务器采用的是Apache PHP/5.3.29,采用了squid/3.5.26缓存加速技术,难怪访问查询速度那么快,看来HD的小伙伴们是有用心优化过的。
看了下squid官网,基本是Linux版本,windows squid 3.x版本的还是开发版的,那么前端网站很有可能是Linux系统了。
至于编译器,完全可以采用单独服务器部署,没法准确判断系统。

【转载请注明出处: http://blog.csdn.net/leytton/article/details/79478558
PS:如果本文对您有帮助,请点个赞让我知道哦~微笑

### 3.1 使用循环结构处理多组输入HDOJ平台上,处理多组输入通常使用循环结构,例如 `while` 或 `for` 循环,持续读取输入直到文件结束(EOF)。对于求和问题,可以通过循环读取每个输入值 `n`,并计算从1到 `n` 的累加和。以下是一个使用C语言实现的示例: ```c #include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } printf("%d\n", sum); } return 0; } ``` 这种方法适用于输入数据较少的情况,但时间复杂度为 $O(n)$,在处理大规模数据时效率较低[^1]。 ### 3.2 利用数学公式优化计算 为了提高效率,可以使用数学公式 $ \text{SUM}(n) = \frac{n(n + 1)}{2} $ 来计算从1到 `n` 的和。这种方法避免了循环,时间复杂度为 $O(1)$,适用于所有输入规模。以下是一个使用C语言实现的示例: ```c #include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int sum = n * (n + 1) / 2; printf("%d\n", sum); } return 0; } ``` 这种方法在HDOJ平台上更为常见,因为它能够在保证正确性的同时显著提升程序运行效率。 ### 3.3 使用C++实现多组输入处理 在C++中,同样可以使用 `while` 循环读取多组输入,并结合数学公式进行求和计算。以下是一个使用C++实现的示例: ```cpp #include <iostream> using namespace std; int main() { int n; while (cin >> n) { int sum = n * (n + 1) / 2; cout << sum << endl; } return 0; } ``` 该代码利用了C++输入流 `cin` 进行数据读取,能够高效处理多组输入,并在每组输入输出对应的求和结果。 ### 3.4 注意事项与输入输出格式 在HDOJ平台上,必须严格遵循题目要求的输入输出格式。例如,输出结果后是否需要换行、是否需要额外的空行等。例如,在某些题目中,每个输出结果后需要一个空行,此时可以修改输出语句为: ```c printf("%d\n\n", sum); ``` 或在C++中: ```cpp cout << sum << endl << endl; ``` 确保程序的输出格式与在线评测系统要求完全一致,以避免因格式错误导致的提交失败[^1]。 ### 3.5 代码优化与函数封装 为了提高代码可读性和复用性,可以将求和逻辑封装在一个函数中。例如,在C语言中: ```c #include <stdio.h> int calculateSum(int n) { return n * (n + 1) / 2; } int main() { int n; while (scanf("%d", &n) != EOF) { printf("%d\n", calculateSum(n)); } return 0; } ``` 或在C++中: ```cpp #include <iostream> using namespace std; int calculateSum(int n) { return n * (n + 1) / 2; } int main() { int n; while (cin >> n) { cout << calculateSum(n) << endl; } return 0; } ``` 通过函数封装,可以提高代码的模块化程度,便于维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值