为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

A+B问题

来自NOCOW
(跳转自URAL/1000)
跳转到: 导航, 搜索
 这篇文章可以证实是由NOCOW用户原创,不存在任何版权争议。
 本文作者同意以GNU FDLCC-by-saGNU 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),自己写数字输入输出可能也是比较困难的地方。

另外上面要注意的问题,也可能会让人不小心出错。

[编辑] 评价及扩展

尽管此题牵涉到一些相当重要而深奥的知识点,但是由于很多语言非常贴心的为用户准备好了加法运算,所以此题变得较为容易。

这道题是为了测试输入输出和提交方法用的,没有多少技术含量。

USACOYour Ride Is Here还考察了基本的语法,目的还有测试做题的人会不会编程。而Life, the Universe, and Everything同时也为BrainF**k等语言的使用者考虑了,是一道不需要数字输入输出,什么语言都可以很简单的做出来的题目。另外还有一个经常用来测试的程序:输出Hello World,但是Hello World的程序没有输入部分。

而这道题目的扩展通常只是加入数据范围之类的陷阱,用其他的进制计算高精度数支持操作符之类的。第二、三条通常只是练习题目,最后一条在编译器、解释器之类的很多地方都比较有用,但是这种程序绝大部分都不是关于A+B的内容。

[编辑] 经典延伸题

POJ 2756

[编辑] 题目编号


[编辑] 所用算法和数据结构

算法1:无。 算法2:数组,高精度加法 算法3:位运算

[编辑] 相关题目

个人工具