第01章 ACM基本输入输出
笔试时ACM格式的输入输出总结

笔试时ACM格式的输⼊输出总结
很多⼤⼚笔试时不是像平时Leecode那样后台写好了输⼊输出,使⽤ACM格式时需要⾃⼰编写输⼊输出。
常⽤的输⼊输出⽅法格式:
scan.next() //读取有效字符串(不论是空格还是回车都会认为是空⽩然后进⾏断点)
scan.nextInt()/scan.nextDouble()/scan.nextByte()//读取有效整型/双精度型/字节型数据类型,以空⽩作为断点
scan.hasNext() //判断是否还有有效字符串
scan.nextLine()//判断是否还有下⼀⾏,以回车视作断点
处理字符串的常⽤⽅法:
可以将读取的字符串s.split(" ")返回⼀个字符串类型数组,将字符串以空格为断点(有时候以,作为断点)将字符串分为字符串数组。
也可以使⽤next()⽅法(仅限于字符串以空格或者回车作为断点时使⽤)挨个读取字符串并将其保存到List中。
ACM基本输入输出(C语言)

OJ简介
OJ简介: ACM比赛中主要以OJ(即Online Judge)判题为主,用 来在线检测程序的正确性。OJ采用后台黑箱测试, 测试数据非常全面,涵盖各种特殊情况。并且在结 果的比对上也不放过一个空格和回车,这就要求程 序员要有非常严谨的思维。著名的OJ有POJ、HOJ、 UVA等。 轻量级OJ:
ACM基本输入输出
2013年退役ACMer
ACM 简介
ACM原代表美国计算机协会,因其举办的ICPC即国际 大学生程序设计竞赛而闻名全世界,此项赛事要求 学生的在五小时内解决全英文问题,并在效率和速 度以及代码的审查上要求非常严格以至近乎苛刻, 被誉为是计算机界的“奥林匹克”。在大学中,因 其含金量、认可度等非常之高,故而在大学生名企 就业、保研、留学等方面都有着极大的帮助。ACM 也因其独有的比赛趣味也在今天的高校中也得到了 广泛的推广,许多大学生都为之着迷、甚至大学四 年都为之献身。足以说明ACM的魅力所在。
return 0;
}
A+BⅣ
题目描述:此类题目是求n个数的和,输入为先输入一个数组n, 然后后面跟n个数字,求这n个数字的和。同样有多组数据,当 n=0时结束。(题目链接/problem.php?id=1088) 样例输入: 4 1234 512345 0 样例输出: 10 15
总结
常见的ACM的输入输出格式如这些。 多组数据可能还会用到EOF、NULL这些宏。比如 scanf、getchar、gets的返回值。 万变不离其宗,有些题目可能是这些格式的组合, 亦或者是个别情况的变种,比如输出格式要求的变 化等等,就需要各位ACMer灵活多变了。
轻量级入门OJ ACM训练平台
A+Ⅱ
此题相比第一道而言,会提前告诉你是几组数据,第一行的2就表示有两组数据。则此时我们可以考 虑这样写: #include<stdio.h> int main() { int n; int a,b; scanf("%d",&n); while(n--) { scanf("%d%d",&a,&b); printf("%d\n",a+b); }
javaacm输入输出

javaacm输⼊输出转⾃:下⾯说⼀下ACM-ICPC队员初⽤Java编程所遇到的⼀些问题:1. 基本输⼊输出:(1)JDK 1.5.0 新增的Scanner类为输⼊提供了良好的基础,简直就是为ACM-ICPC⽽设的。
⼀般⽤法为:Codeimport java.io.*import java.util.*public class Main{public static void main(String args[]){Scanner cin = new Scanner(new BufferedInputStream(System.in));}当然也可以直接 Scanner cin = new Scanner(System.in);只是加Buffer可能会快⼀些(2)读⼀个整数: int n = cin.nextInt(); 相当于 scanf("%d", &n); 或 cin >> n;读⼀个字符串:String s = cin.next(); 相当于 scanf("%s", s); 或 cin >> s;读⼀个浮点数:double t = cin.nextDouble(); 相当于 scanf("%lf", &t); 或 cin >> t;读⼀整⾏: String s = cin.nextLine(); 相当于 gets(s); 或 cin.getline(...);判断是否有下⼀个输⼊可以⽤ cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble() 等,具体见 TOJ 1001 例程。
(3)输出⼀般可以直接⽤ System.out.print() 和 System.out.println(),前者不输出换⾏,⽽后者输出。
⽐如: Code同⼀⾏输出多个整数可以⽤Code也可重新定义:Codestatic PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));(4)对于输出浮点数保留⼏位⼩数的问题,可以使⽤DecimalFormat类,Codeimport java.text.*;DecimalFormat f = new DecimalFormat("#.00#");DecimalFormat g = new DecimalFormat("0.000");double a = 123.45678, b = 0.12;System.out.println(f.format(a));System.out.println(f.format(b));这⾥0指⼀位数字,#指除0以外的数字。
ACM基本输入输出1

ACM基本输入输出在开始做ACM时,会面临一个输入输出数据的问题,ACM里的输入输出数据和平时的写程序不大一样。
为什么会不一样呢,这就牵涉到评测系统怎么判断你提交的程序是正确的。
实际上评测系统是把程序的标准输入输出数据都是放在文本文件里,提交的程序会先经过编译,然后运行,从输入文件中读取数据,然后把结果输出到一个文本文件中,评测系统再把标准的输出文件和程序运行结果的输出文件进行对比,从而判断提交的程序的正确与否。
既然是这样,要判断提交的程序的正确性就依赖于系统的测试数据,这时就不可能只是用一组测试数据来判断程序的正确性,需要有很多组测试数据,而国际ACM比赛标准的评测系统是PC2,它只支持一个题目一个输入数据文件、一个输出数据文件。
所以这时候就得把多组测试数据放在一个文件里,提交的程序必须把这个文件里的多组输入数据都得出结果。
一、输入:1、只有一组测试数据,这时候是最简单的了,请看题目SDUTOJ1000。
#include <stdio.h>int main(){int a, b;scanf("%d %d",&a,&b);printf("%d\n",a+b);return 0;}2、有多组测试数据,直到读至输入文件结尾为止,这时需要用到while(scanf("%d",&n)!=EOF),请看题目:SDUTOJ1010。
#include <stdio.h>int main(){int a, b;while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF,则退出while循环printf("%d\n",a+b);return 0;}说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。
基本输入输出(1)讲述

1 只有一组测试数据
1 只有一组测试数据
• #include < stdio.h > int main() { int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); return 0; }
1 只有一组测试数据
• #include < iostream > //请注意include的使用, 如果使用#include 在G++编译器上将出现 “Compile Error” using namespace std; int main() { int a,b; cin >> a >> b; cout << a+b << endl; return 0; }
输入
• 2、有多组测试数据,直到读至输入文件结 尾为止,这时需要用到 while(scanf("%d",&n)!=EOF)或while (cin>>n)
Answer
• #include < stdio.h > int main() { int a,b; while(scanf("%d %d",&a, &b) != EOF) printf("%d\n",a+b); return 0; } • 说明:scanf函数返回值就是读出的变量个数,如: scanf( “%d %d”, &a, &b );如果只有一个整数输入,返回 值是1,如果有两个整数输入,返回值是2,如果一个都没 有,则返回值是-1。EOF是一个预定义的常量,等于-1。
ACM输入输出

Sample Output
10 15
/JudgeOnline/pro blem.php?id=1008
2014-5-19
13
Sample Input
3 41234 512345 3123
综合类
Sample Output
10 15 6 /JudgeOnline/problem.php ?id=1010
2014-5-19
5
第三类
输入一开始就会说有N个Input Block,下面接着是 N个Input Block。
Sample Input
2 15 10 20
Sample Output
6 30
/JudgeOnline/proble m.php?id=1004
韩信点兵
for(n=1;;n++) { if((n%3==2)&&(n%5==3)&&(n%7==2)) { printf(“%d\n",n);
} }
韩信点兵
先算3、5、7的最小公倍数3*5*7=105 再算符合除以3余2,除以5余3,除以7余2 的最小值
除以3余2的数:5, 8, 11, 14, 17, 20, 23, 26… 除以5余3的数:8, 13, 18, 23, 28… 除以7余2的数:9,16,23,30…
10
2014-5-19
解法
#include <stdio.h> int main() { int n,sum; int i; int a; while(scanf("%d",&n)!=EOF&&n!=0){ sum = 0; a = 0; for(i = 0;i < n;i++){ scanf("%d",&a); sum += a; } printf("%d\n",sum); } return 0; }
1.ACM简介与输入输出

参考源代码
#include <stdio.h> int main(void) { int a; while(scanf("%d",&a)==1) printf("%d\n",a*a); return 0; }
39/70
本类输入解决方案:
• C语法: while(scanf("%d",&a) = =1) { .... } • C++语法: while( cin >> a) { .... }
24
24/70
25
25/70
为什么要参加编程比赛
• 能力的提高 • 学到很多书本上和大学里面学不到的知识和技能 • 有机会云游四海,可以和众多武林高手同场竞技,交到很 多志同道合的朋友 • $$,出国的机会 • 对未来极其有利 – 高考保送、高考加分、保研 – 大公司不仅自己举办、同时自己举办各类编程竞赛、 非常重视选手的编程比赛经历和成绩 • 编程竞赛非常有趣!
34/70
输入_第一类:读入一个参数
• 输入不说明有多少个Input Block,以EOF或-1 为结束标志。 • 读入一个输入对应一个输出,输入数据可以是 多组
35/70
• 题目分析 怎样判断输入的结束? • scanf函数的原型如下: int scanf(const char *format [, argument]... ); • 其返回值为:成功读取并分配的元素个数。
1987
1986
美国圣路易斯
美国辛辛那提
斯坦福大学
加州理工学院
美国
美国
1985
1984 1983 1982 1981 1980 1979 1978
ACM基本输入输出

scanf(“%d%d”,&a,&b) ; printf(“%d\n”,a+b); } return 0; }
第三类输入(HDOJ 1091)
第三类输入 (首先给出数据组数HDOJ 1091源代码)
// HDOJ 1091 A+B for Input-Output Practice (III) #include <stdio.h> int main() {
if(i>1) printf("\n"); sum=0; scanf("%d",&n); while(n--) {
scanf("%d",&a); sum+=a; } printf("%d\n",sum); }
总结一下:( 小技巧、规定)
1、main 函数返回值为int 型(正式比赛要求) 2、 scanf函数返回值就是读出的变量个数,没有读到数
int n,a,sum; while ( scanf("%d",&n), n ) {
sum=0; while ( n-- ) {
scanf("%d",&a); sum+=a; } printf("%d\n",sum); } return 0; }
HDOJ 1093
HDOJ 1093 源程序
int c,n,a,sum; scanf("%d",&c); while(c--) {
sum=0; scanf("%d",&n); while(n--) {
ACM入门

输入输出
• 读一个非空白字符, • 方法一:
– char str[2]; scanf(“%1s”, str); – // %1s扫描前导空白,并且只读一个字符 – char c = str[0];
• 方法二:
– 强制扫描空白 – 在%前面加上一个空格表示“强制扫描前导空白” – scanf(“ %c”, &ch); – 前面那个读人物信息的完整scanf语句:
17
Related Resource
• TopCoder :
– /tc
• 一个月4次左右,有rating • 分两个版(Div I, Div II) • 参加人数众多 • 每次比赛后有详细的解题报告、代码 • 比赛结束后有Practice Room可以继续做 • 可以查看每一个人的代码 • Forum很热闹,乐于助人 • 有$
– 1支队伍1台机器(提供打印服务)
– 上机编程解决问题(可以携带诸如书、手册、 程序清单等
参考资料;不能携带任何可用计算机处理的软件或数据、不 能携带任何类型的通讯工具)
– 实时测试,动态排名
• 试题
– 6-10题
– 全英文(可以带字典) • 时间:持续5个小时;
8
• 支持语言:c/c++, java, pascal
29
Input • The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output • For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input • 15 • 10 20 Sample Output • 6 30 • 30
ACM中常用的输入输出方式

ACM中常⽤的输⼊输出⽅式 不论是在ACM/ICPC这样类型的⽐赛中,还是在做项⽬中,对于输⼊输出的格式尤为重要,不可以想当然的按⾃⼰那⼀套⾛,我们需要根据题⽬要求进⾏操作,对于第⼀次接触这⽅⾯⽐赛的⼩⽩,最为常见的现象便是类似于下⾯这⾏代码1 printf(“请输⼊⼀组数据:”);2 cout<<"输出的结果为"; 倘若题⽬没有要求你,千万不要有多余的输出,虽然在测试的时候⽅便⾃⼰,但也⿇烦在提交运⾏时注释掉,因为电脑可没有你的⼤脑那样灵活,他要对⽐的数据很死板,多⼀个空格少⼀个空格都不⾏,所以,在这⼀块的处理⼀定要细⼼!细⼼!再细⼼!下⾯我们来看下常见的输⼊输出格式有哪些⼀、基本输⼊输出1、单组输⼊输出已知题⽬有两个变量a和b,现在就要输⼊a和b,操作如下1 //C2 scanf("%d %d",&a,&b); printf("%d %d\n",a,b);3 //C++4 cin>>a>>b; cout<<a<<b<<endl;这个很简单,那么如果题⽬输⼊n组a和b怎么办呢2、n组输⼊输出1 //C2 scanf("%d",&n);3 while(n--) {scanf("%d %d",&a,&b); printf("%d %d\n",a,b);}4 //C++5 cin>>n;6 while(n--){cin>>a>>b;cout<<a<<b<<endl;}也没有那么难嘛,现在如果n不告诉你,要求输⼊多组a和b该如何操作呢?3、多组输⼊输出(重点来了)1 //C2 while(scanf("%d %d",&a,&b)!=EOF){printf("%d %d\n",a,b);}//第⼀种写法3 while(scanf("%d %d",&a,&b)==2){printf("%d %d\n",a,b);}//第⼆种写法4 while(~scanf("%d %d",&a,&b)){printf("%d %d\n",a,b);}//第三种写法5 //C++6 while(cin>>a>>b){cout<<a<<b<<"\n";}竞赛中经常采⽤这种输⼊输出⽅式。
教案1_2_ACM输入输出

• 1、只有一组测试数据; • 2、有多组测试数据,但一开始就告诉 你测试数据的数目; • 3、有多组测试数据,没有告诉你有几 组,但却告诉你读到某些特定的数据 后结束; • 4、有多组测试数据,既没有告诉你有 几组又没有告诉你读到哪些特定的数 据结束。
1、只有一组测试数据
• 请看:送分题-A+B Problem • 这题只有一组测试数据,直接写即可。请 看以下三种不同语言所写的程序:
#include <stdio.h> int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int n_case; scanf("%d",&n_case); int i; for(i=0;i<n_case;i++) { int n; scanf("%d",&n); int sum = 0; int num; while(n--) { scanf("%d",&num); sum += num; } if(i) { putchar('\n'); //printf("\n"); } printf("%d\n",sum); } return 0; }
• 这样我们就可以用 while(scanf(......) != EOF) { …… …… } • 请看以下程序:
#include <stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b) != EOF) { printf("%d\n",a+b); } return 0; }
杭电OJ:1089----1096(c++)(ACM入门第一步:所有的输入输出格式)

杭电OJ:1089----1096(c++)(ACM⼊门第⼀步:所有的输⼊输出格式)1089:输⼊输出练习的A + B(I)问题描述您的任务是计算a + b。
太容易了?!当然!我专门为ACM初学者设计了这个问题。
您⼀定已经发现某些问题与此标题具有相同的名称,是的,所有这些问题都是出于相同的⽬的⽽设计的。
输⼊项输⼊将由⼀系列由空格隔开的整数对a和b组成,每⾏⼀对整数。
输出量对于每对输⼊整数a和b,应该在⼀⾏中输出a和b的总和,并且在输⼊中每⾏输出⼀⾏。
样本输⼊1 5 10 20样本输出6 30题解:#include<cstdio>#include<iostream>using namespace std;int main(){int a, b,sum;while(cin >> a >> b){sum = a+b;cout << sum << endl;}return 0;}1090:投⼊产出练习的A + B(II)问题描述您的任务是计算a + b。
输⼊项输⼊的第⼀⾏包含⼀个整数N,然后是N⾏。
每⾏由⼀对整数a和b组成,每对之间⽤空格隔开,每⾏⼀对整数。
输出量对于每对输⼊整数a和b,应该在⼀⾏中输出a和b的总和,并且在输⼊中每⾏输出⼀⾏。
样本输⼊2 1 5 10 20样本输出6 30题解:#include<cstdio>#include<iostream>using namespace std;int a,b,n,sum;cin >> n;while (n){cin >> a >> b;sum = a + b;cout << sum << endl;n--;}return 0;}1091:投⼊产出练习的A + B(III)问题描述您的任务是计算a + b。
ACM之基本输入输出

• getchar():读入一个字符 • whlie((ch=getchar())!=EOF){ • } • gets():读入一行 • while(gets(buf)!=NULL) { • } • 3.以0或-1结束的输入. • while(scanf("%d",&n),n!=0) { • • }
以特定元素作结束符
• 这种输入和第一种类似。常见的是规定以0或-1作为结束符。例如 hdu1091,参考代码: • #include<stdio.h> • int main(void) • { • int a, b; • while (scanf("%d %d", &a, &b), a || b) • printf("%d\n", a + b); • return 0; • }
• 同样gets和scanf("%s")的功能也比较相似, 但是scanf("%s")在读入字符串是遇到空格 或是回车时就会结束,gets可以读入一行 含有空格的字符串,在遇到回车符时结束 输入。而且scanf("%s")和gets也是从输入 流的当前位置处读入一个字符串。比如:
• scanf(“%d”,&n);
只有一组测试数据
• • 这类题目是最简单的,比如下面的a+b题目(PKU1000)。 参考代码: • #include<stdio.h> • int main() • { • int a, b; • scanf("%d %d", &a, &b); • printf("%d\n", a + b); • return 0; • }
ACM第一课正确处理输入输出

ACM 第一课正确处理输入输出一,输入输出原理之所以我们平时编程输入输出都是在一个黑框框里面完成的,是因为你输入流和输入流都是在这个黑框框里面看到的。
所以导致好多同学看到“Sample Input”1 23 45 67 8想到的是先把所有输入存起来,然后再输出a+b的结果。
因为这样在黑框框里面看到的结果才和标准的一样。
如果你真的明白了什么是输入输出流,你就不会这么写了。
如上图,你给程序一个输入流,经过程序处理后,会给出一个输出流。
默认情况下,输入流由键盘敲入,就是俗称的黑框框。
输出流的显示也是在黑框框里面。
如果我们人工改变它,比如,输入流成了一个文本文档,输出流也成了一个文本文档。
将这两项分开。
你现在就应该明白为啥会这样写了吧?其中用途是将输入流重定向为一个文档文件in.txt同理是将输出流重定向为一个文档文件out.txt打开当前cpp 文件所在目录新建一个名字为in 的txt文档,在里面输入1 34 56 7保存,然后执行上一段代码,会自动生成一个out.txt打开里面,你就看到输出结果5913怎样?是不是和题目给的sample in 和sample out 格式看起来一样了?所以你在考虑编程的时候要把输入输出流分开考虑。
不必先把所有输出流存下来然后输出,来一个输一个就OK了。
细心的人会发现我在循环里面写的是EOF 是end of file 明白了吧?默认系统给他的值是-1 用-1 替换EOF 也行,不过为了程序的可阅读性。
还是用EOF好。
为啥不用cin?cin,cout 的处理速度很慢,之所以你没有体会到,是因为给你的用力少,如果给你1000000000个用力,cin 接收字符的速度慢就会被放大,有的题就会超时。
所以建议大家全用scanf 和printf 。
Scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。
ACM教程 输入输出

程序样例,输入两个整型变量a和b,并输出:
#include<stdio.h> int main() { int a,b; scanf("%d%d",&a,&b); printf("a=%d b=%d\n",a,b); return 0; }
还有就是我们有的时候需要在输出浮点数时,需要指定保留一定位数 的小数。这时,格式控制符应该使用: %.nlf
n是一个大于等于0的整数,这样可以来表示保留小数的后n位小数,保 留原则遵循四舍五入原则,假设一个双精度类型变量a的值为3.141592, 那么printf("%.3lf\n",a); 输出的值就应该是3.142。如果小数位数小于n 那么后面将用0来占位
因为输入输出函数的格式控制符从左至右与输入的元素一一对应,因此在编 程时程序员一定要保证格式控制符的正确性,由于编译器不会对格式控制符 列表做严格的检查,因此这里往往是初学者的易错点。
பைடு நூலகம்
格式控制符的其它用法:
可以在"%"和字母之间插进数字表示最大场宽。例如: %3d 表示输 出3位整型数, 不够3位右对齐。而%9lf 表示输出场宽为9的双精度浮 点数。 %8s则表示输出8个字符的字符串, 不够8个字符右对齐。但是, %8s 表示输出8个字符的字符串, 不够8个字符右对齐。 样例程序:
41 3
10 10
if 语句的另外一种形式:
if(表达式) {
语句块......
} 此时 if 没有与任意的 else 进行配对,那么程序在不满足 if 条件时会继 续执行 if 结构后面的语句。请分析下面程序: #include<stdio.h> int main() {
ACM竞赛之输入输出

在这种情况下,如果没有题目的说明,程序无法知道哪里是字符串的分界。那么,用scanf("%c",&ch)来读,一边读,一边判断分界条件是否满足,如果满足,则把当前读到的东西存到一个字符串中。
三、输出处理
在初次接触ACM程序设计竞赛时,可能认为:样例中都是输入数据和输入数据在一起,输出结果和输出结果在一起,可能会开个数组,把每组的结果存起来,等输入完了再一起输出。当遇到不知有多少组测试数据的题,就难以处理了。
2. 多组输入数据,不说明多少组,直到读至输入文件末尾为止
示例:A + B Problem (1)
C语法:
#include <stdio.h>
int main()
{
int a,b;
while (scanf("%d %d",&a, &b) != EOF)
printf("%d\n",a+b);
03:memset(str, ' ', 1000 * sizeof(char));
04:sprintf(str, "%s", str1);
05:str[strlen(str1)] = ' ';
06:sprintf(str + 5, "%5s", str2);
07:str[10] = ' ';
其中“*”代表空格。
要求是这样的:str1在前5个字符中左对齐,str2在第6到第10个字符中右对齐,str3在第11到第15个字符中右对齐。
可行的做法是,先初始化一个数组,用' '(空格)填充,再在相应的位置填相应的内容。用程序来表述:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
scanf(“%d %d”,&a,&b); scanf() 函数 返回值为成功读取的数据个数 记住是个数而不是值。读到文件结尾返回-1. EOF End Of File 宏定义常量, 相当于-1
我的第一个ACM的程序 的程序 我的第一个 源代码) (HDOJ 1089源代码) 源代码
// HDOJ 1089 A+B for Input-Output Practice (I) #include <stdio.h> int main() { int a,b; while (scanf(“%d%d”,&a,&b) != EOF) { printf(“%d\n”,a+b); } return 0; }
第二类输入( 第二类输入(HDOJ 1090) )
第二类输入 首先给出数据组数HDOJ 1090源代码) 源代码) (首先给出数据组数 源代码
// HDOJ 1090 A+B for Input-Output Practice (II) #include <stdio.h> int main() { int n,a,b; scanf(“%d”,&n); while (n--) { scanf(“%d%d”,&a,&b) ; printf(“%d\n”,a+b); } return 0; }
第三类输入( 第三类输入(HDOJ 1091) )
第三类输入 首先给出数据组数HDOJ 1091源代码) 源代码) (首先给出数据组数 源代码
// HDOJ 1091 A+B for Input-Output Practice (III) #include <stdio.h> int main() { int a,b; while (scanf(“%d%d”,&a,&b) ,a!=0 || b!=0) { printf(“%d\n”,a+b); } return 0; } 或者是:if(a==0 && b==0) break;
ACM的基本输入输出 的基本输入输出
讲完了!!
作业: 作业:
1.
熟悉OJ 提交(Submit) HDOJ 1089 – 1096 8题掌握基本输入输出格式(已讲解) HDOJ 2006 求奇数的乘积 HDOJ 2010 求水仙花数
2.
3. 4.
ACM基本输入输出 第 01 章节 ACM基本输入输出
CCUTSOFT ACM Team
C语言格式输入输出 语言格式输入输出 (Standard Input and Output) #include <stdio.h>
一个简单的C程序 一个简单的 程序
#include <stdio.h> void main() { int a,b; scanf(“%d %d”,&a,&b); printf(“%d”,a+b); }
HDOJ 1094
HDOJ 1094
int n,a,sum; while( scanf("%d",&n) != EOF) { sum=0; while( n-- ) { scanf("%d",&a); sum+=a; } printf("%d\n",sum); }
HDOJ 1095
HDOJ 1095 另一类输出
HDOJ 1093
HDOJ 1093 源程序
int c,n,a,sum; scanf("%d",&c); while(c--) { sum=0; scanf("%d",&n); while(n--) { scanf("%d",&a); sum+=a; } printf("%d\n",sum); }
别被英文吓倒, 别被英文吓倒, 其实题意很简单, 其实题意很简单,看数据也能明白
其实,就是: 输入的每行有两个数字:a 和b 让你计算a+b的和,并输出 输出每个结果后换行
思考: 思考:
我的程序只能处理一组输入, 我的程序只能处理一组输入, 而题目中输入数据组数不定,怎么办? 而题目中输入数据组数不定,怎么办?
写个程序: 写个程序: #include <stdio.h> int main() { int a,b; scanf(“%d%d”,&a,&b); printf(“%d\n”,a+b); return 0; }
ACM 程序主函数main() 要用int型,并切勿忘记 return 0;
知识与能量不足 补充知识与能量, 补充知识与能量,才能继续战斗
HDOJ 1092
HDOJ 1092 源程序: 源程序:
// HDOJ 1090 A+B for Input-Output Practice (IV) #include<stdio.h> int main() { int n,a,sum; while ( scanf("%d",&n), n ) { sum=0; while ( n-- ) { scanf("%d",&a); sum+=a; } printf("%d\n",sum); } return 0; }
总结一下: 三种输入, 总结一下: 三种输入,三种输出
1、数据量不定while(scanf(“%d”,&n) != EOF) 2、先给数据量scanf(“%d”,&n); while (n--){} 3、以某数值或符号结束 while(scanf(“%d”,&n),n) 1、直接输出数据然后换行 2、每组数据后follow一个空行 3、每两组数据之间between一个空行
总结一下:( 小技巧、规定) 总结一下:( 小技巧、规定)
1、main 函数返回值为int 型(正式比赛要求) 2、 scanf函数返回值就是读出的变量个数,没有读到数 据,返回-1。 EOF是一个预定义的常量,等于-1 3、scanf()函数读入数据,不能规定精度, 如: scanf("%7.2f",&a); 是不合法的 3、C语言只有printf(“”); 输出换行用printf(“\n”); 没有println(“”); 不要受Java影响 4、C 语言不支持在for()语句里定义变量, 如for(int i=0; i<10; i++) 是错误的
ACM 基本输入输出
今天我们就来解决 ACM中的输入输出问题 ACM 输入输出特点: 1. 非人工判题,不需要Please input data:等提示 信息 2. 每组数据相对独立,不需要保存 3. 输入输出格式不定,但是简单,掌握了,以 后争取不在输入输出格式上犯晕
先看一个简单的题目☺ 先看一个简单的题目☺ HDOJ 1089
HDOJ 1096
HDOJ 1096 最后一种输出
int c,n,a,sum,i; scanf("%d",&c); for(i=1; i<=c; i++) { if(i>1) printf("\n"); sum=0; scanf("%d",&n); while(n--) { scanf("%d",&a); sum+=a; } printf("%d\n",sum); }