第一讲 基本的输入输出
一.ACM中常见的几种输入方式
我们称一组测试数据为一个Case。根据题目Case数量分为两类:
1. 单Case的情况
此类情况在比赛中比较少见,而且我们一般遇到这种情况的处理方式也是作为多Case情况的第一种方式,请参阅2.1。
2. 多Case的情况
在比赛中经常会见到各种多Case的输入情况。我们根据给出Case数量的方式又分为以下几类:
2.1 直到读至输入文件结尾为止。
例1.HDU 1089
解答:
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d\n",a+b);
return 0;
}
说明:scanf函数返回值就是读出的变量个数。如果没有读入数据,则返回值是-1。EOF是一个预定义的常量,等于-1。
2.2 先给出Case数量T,然后给出T组Case。
例2.HDU 1090
解答:
#include <stdio.h>
int main()
{
int T,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
说明:我们一般以T作为Case数量,并且以whlie(T--)作为循环控制,而不是用for循环。这样做的好处是不需要利用循环变量i来控制循环次数。
2.3 以某个特殊输入为结束标志。
例3.HDU 1091
解答:
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b) && a+b)
printf("%d\n",a+b);
return 0;
}
2.4 混合方式
例4. HDU 1092
解答:
#include <stdio.h>
int main()
{
int n,x,ans;
while(scanf("%d",&n) && n)
{
ans=0;
while(n--)
{
scanf("%d",&x);
ans+=x;
}
printf("%d\n",ans);
}
return 0;
}
说明:我们一般采用变量ans来表示最终结果,还有一些常用的变量如:cnt(计数),vis[](访问标记数组),ncase(测试数据组数)。希望大家能够熟练使用这些变量名称。
二.ACM中常见的几种输出方式
一般输出格式比较容易控制,只要严格按照题目要求来就可以了。但还是要注意以下几个问题:
1.多Case的输出时Case之间是否有空行。
2.最后一组Case之后是否有空行。
3.一组Case需要输出多个数据时,最后一个数据后面一般是没有空格的。
对于输出格式的控制,这里不做过多介绍,希望大家参考C语言教材。
三.数据表示的范围
我们一定要熟记每种数据类型的表示范围:
1.int型整数范围:[-2^31,2^31-1],比[-10^9,10^9]略宽;
2.Double型浮点数范围:约为正负[10^-308,10^308];
3.我们也会遇到32位int型整数处理不了的整数,这时如果数据范围不是很大时,我们一般采用64位整数。范围为[-2^63,2^63-1,比[-10^19,10^19]略宽;在Linux的GCC中使用long long,输入输出用%lld,在windows的VC6.0中使用__int64,输入输出用%I64d。具体使用哪种做法要视OJ而定。
4.对于64位整数也表示不了的整数或者double型表示不了的浮点数,我们会专门利用大数处理,这个以后再详细介绍。