为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
A+B问题
这篇文章可以证实是由NOCOW用户原创,不存在任何版权争议。 本文作者同意以GNU FDL、CC-by-sa和GNU LGPL(如果适用)三种版权发布此文章(不包括翻译文章中属于原始所有者的部分版权)。 如果你修改了这篇文章并且不同意用GNU FDL以外的版权发布,可以换一个版权模板或者移除此模板。
A+B问题是一个非常简单的程序设计问题。通常是在线题库用来让人测试提交和输入输出方法的题目。
- 这是POJ 中的OI题目A+B Problem的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
- 这是NKOJ 中的OI题目A+B Problem的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
- 这是ZJU 中的OI题目A+B Problem的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
- 这是URAL Volume 1 中的OI题目A+B Problem的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
- 这是SGU 中的OI题目A+B Problem的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
- 这是VIJOS 中的OI题目A+B Problem的介绍及题解,参见 C语言代码,C++语言代码,Pascal语言代码。
目录 |
[编辑] 一般描述
输入两个数A和B(一般是在长整范围内的正整数,也就是小于2147483648),输出A+B。 //以下是胡扯 本题算法:动态规划+微积分+高精度 将a分解成a个1相加 将b分解成b个1相加 利用高精度算法依次累加a个1和b个1的和 然后将多个和进行比较 利用动态规划求出最正确的解 利用微积分观点可证明此算法正确性 标程如下
var a,b,i:int64; s:int64; begin readln(a,b); for i:=1 to a do inc(s); for j:=1 to b do inc(s); writeln(s); end.
但是 此题仍然存在着一个最严重的问题尚未解决:1+1为什么=2? 1+2为什么=3?…… 等等等等 依此类推 请世界上所有的大牛和超大牛帮忙解决 感激不尽
{为什么要证明哦,这应该是人定的吧}
{确实不用证明, 因为2的定义是1+1, 3的定义是1+2. 这是定义, 没有证明.}
{可以通过peano公设得出基本运算规律。至于1和2之类的符号就是人为定义的,在那个公理系统中表示某个特定的意义}
{这件事情是一个巨大的难题,当年不知道有多少人为之想不清楚吐血而亡}
{微~~微~~微~~微积分 飘过}
//以上是胡扯
[编辑] 范例程序
[编辑] Pascal
VAR a,b:longint; BEGIN readln(a,b); writeln(a+b); END.
还有两种迥异程序:
{$asmmode Intel} var a,b,c:longint; begin readln(a,b); asm mov eax,a add eax,b mov c,eax end; writeln(c); end.
var a,b,c:dword; begin read(a,b); while b<>0 do begin c:=a and b; a:=a xor b; b:=c shl 1; end; writeln(a); end.
[编辑] C++
#include<iostream> using namespace std; int main() { long a,b; cin>>a>>b; cout<<a+b<<endl; }
[编辑] C
int main() { long a,b; scanf("%d%d",&a,&b); printf("%d\n",a+b); }
[编辑] Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int a=in.nextInt(); int b=in.nextInt(); System.out.println((a+b)); } }
适用于所有输入两个0到2147483647之间的十进制数的,使用标准输入输出的A+B问题。
[编辑] 要注意的问题
在有的版本的A+B题目中,虽然输入的a和b都在长整的范围之内,结果a+b的值不一定也在这个范围。这时候就要使用无符号的长整数,也就是pascal的longword或者cardinal、c++的unsigned long。如果这道题目的数据也允许负数,就要使用64位整数,pascal的int64以及c++的long long。当然也可以特殊处理,不过比较麻烦。
[编辑] 难点
这个题库可能会使用特殊的输入输出方法(例如文件输入),也可能要求提交的时候加入一些附加信息,如果没在这个题库做过题目也没有看帮助,或者以前完全没有使用文件的经验,这可能就是难点。
另外对于一些不自带数字输入输出功能的语言(例如BrainF**k),自己写数字输入输出可能也是比较困难的地方。
另外上面要注意的问题,也可能会让人不小心出错。
[编辑] 评价及扩展
尽管此题牵涉到一些相当重要而深奥的知识点,但是由于很多语言非常贴心的为用户准备好了加法运算,所以此题变得较为容易。
这道题是为了测试输入输出和提交方法用的,没有多少技术含量。
USACO的Your Ride Is Here还考察了基本的语法,目的还有测试做题的人会不会编程。而Life, the Universe, and Everything同时也为BrainF**k等语言的使用者考虑了,是一道不需要数字输入输出,什么语言都可以很简单的做出来的题目。另外还有一个经常用来测试的程序:输出Hello World,但是Hello World的程序没有输入部分。
而这道题目的扩展通常只是加入数据范围之类的陷阱,用其他的进制,计算高精度数,支持操作符之类的。第二、三条通常只是练习题目,最后一条在编译器、解释器之类的很多地方都比较有用,但是这种程序绝大部分都不是关于A+B的内容。
[编辑] 经典延伸题
POJ 2756
[编辑] 题目编号
[编辑] 所用算法和数据结构
算法1:无。 算法2:数组,高精度加法 算法3:位运算