ACM基本输入输出
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); }
ACM新手之八大输入输出格式

ACM新手之八大输入输出格式文章分类:C++编程在ACM题库中,不管是文件输出(输入)还是标准输出(输入),都有着一定的格式,下面我就以杭电1089——1096为例子,简单的介绍一下。
第一种:A+B for Input-Output Practice (I)【输入】有多组输入数据,但没有具体的告诉你有多少组,只是让你对应每组输入,应该怎样输出。
【输出】有多组输出,对应着每组输入,每组输出占一行。
【代码】对于上述常见的情况,我们可以用下面的代码来解决。
没有告诉我们有多少组,我们只需要等待即可:while (scanf (……) != EOF)相对应输入,输出只需要在while中输出。
【完整代码】第二种:A+B for Input-Output Practice (II)【输入】先输入一个整数,告诉我们接下来有多少组数据,然后在输入每组数据的具体值。
【输出】有多组输出,对应着每组输入,每组输出占一行。
【代码】这也是一种常见的输入形式,简单的代码,我们可以先用scanf函数输入第一个整数来确定有多少行,然后在用for循环一组一组的输入。
【完整代码】第三种:A+B for Input-Output Practice (III)【输入】有多组输入数据,没有具体的告诉你有多少组,但是题目却告诉你遇见什么结束。
【输出】有多组输出,没对应一组输入都有相应的输出,结束标记不用管!【代码】这种类型的题目和第一种差不多,但是有一点值得注意,就是要加上结束条件。
对于这道题我么可以这样while(scanf(“%d%d”, &a, &b) && (!(a==0 && b==0))),当然你也可以将条件写在while循环的内部,条件满足时break即可。
【完整代码】第四种:A+B for Input-Output Practice (IV)【输入】输入有多组,并却题目告诉你每组输入遇见什么结束,与第三种不同之处在于,每组输入都有相应的细化。
多组数据输入输出

2013-7-31
13
Hdoj_1091源代码:
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) &&(a!=0 && b!=0))
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) != EOF)
}
printf("%d\n",a+b);
2013-7-31
7
本类输入解决方案:
C语法: while(scanf("%d %d",&a, &b) != EOF) { .... } C++语法: while( cin >> a >> b ) { .... }
18
2013-7-31
说明(5_1):
scanf(“ %s%s”,str1,str2),在多个字符串之 间用一个或多个空格分隔; 若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。 通常情况下,接受短字符用scanf函数,接 受长字符用gets函数。 而getchar函数每次只接受一个字符,经常 c=getchar()这样来使用。
一个Input Block对应一个Output Block, 每个Output Block之后都有空行。 参见:HDOJ_1095
关于C语言的“输入输出”内容的详细介绍资料

注意事项
输入的数据多于数据项时,多于的数据自动作废。
#include<stdio.h> void main() {
int x,y; scanf("%2d%3d",&x,&y); printf("%d\n%d\n",x,y); }
输入:12345678 得到:
* 什么意思?
x,X
十六进制无符号整数
o
八进制无符号整数
u
不带符号十进制整数
c
单一字符
s
字符串
e,E
指数形式浮点小数
f
小数形式浮点小数
g
e和f中较短一种
%% 百分号本身
int a=567;printf ( “%d”,a); int a=255;printf(“%x”,a); int a=65;printf(“%o”,a); int a=567;printf(“%u”,a); char a=65;printf(“%c”,a); printf(“%s”,“ABC”); float a=567.789;printf(“%e”,a); float a=567.789;printf(“%f”,a); float a=567.789;printf(“%g”,a); printf(“%%”);
输入项不能确定小数位,输出可以有
#include<stdio.h> void main() {
int x; float y; scanf("%d%f",&x,&y); printf("%d\n%.2f\n",x,y); }
输入:123.456 得到:
ACM竞赛简介和入门

ACM竞赛简介:ACM国际大学生程序设计竞赛是由国际计算机界历史悠久、颇具权威性的组织ACM学会(美国计算机协会)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。
(网上有更详细的介绍,这里只做个简介)ACM竞赛特点:竞赛中一般有10道题,比赛时间为5个小时,每支参赛队伍由3名选手组成,可以携带诸如书、手册、程序清单等参考资料,对每一道题编完代码后,将代码提交裁判,每一次提交会被判为正确或者错误,判决结果会及时通知参赛队伍。
在规定时间内提交并通过题目数越多排名越靠前。
(时间5小时,题目8~12题,同题目数按所用时间多少排名)ACM题目限制:●时间限制(即程序运行所用的时间)●空间限制(即程序运行时所开内存的多少)ACM基本要求⏹英语⏹分析理解能力⏹算法⏹编码⏹合作ACM竞赛意义学习编程,并不是为了参加竞赛,ACM竞赛对于我们的意义更多的还是专业能力的提高。
在备战过程中,无论是对自己的编程能力,还是团队合作解决问题的能力,都是一种很好的锻炼机会。
一般而言,每个在做ACM竞赛的学生,他们的编程能力会比较出色。
与数学建模相比,由于ACM 竞赛针对的是我们学计算机的同学,所以没有数学建模的比赛规模,但是依旧是国际上最有影响力的大学生竞赛之一。
ACM竞赛入门现在有很多大学有专门为ACM 竞赛开设自己的测评网站,上面有很多贴近竞赛的题目。
比如说北大poj,浙大zoj等等。
所以选择一个自己专门练习的网站,开始自己在上面做题,和同学交流经验。
等到回到本部,要是有了一定的实力和基础。
⏹在poj上做20左右道简单的题目,熟悉ACM题目的基本特点。
(这里列出几道相对较简单的题目的题号:1000,1003,1004,1046,1207,1226,1504,1552)⏹熟悉了poj之后,按照poj的题目分类,买一本或借一本算法的书(暨大ACM校队的基本都用机械工程出版社的《算法导论》)开始学习,然后做算法的专题,一般每个专题做10~30道。
国际大学生程序设计大赛(ACM-icpc)输入输出介绍

本类输入解决方案:
C语法: scanf("%d",&n) ; for( i=0 ; i<n ; i++ ) { .... } C++语法: cin >> n; for( i=0 ; i<n ; i++ ) { .... }
2012-3-26 12
输入第三类:
输入不说明有多少个Input Block,但以某个特殊输入为结束标志。 ex-3
2012-3-26 10
ex-2源代码:
#include <stdio.h> int main() { int n,i,a,b; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d %d",&a, &b); printf("%d\n",a+b); } }
2012-3-26 11
ACM程序设计
输入输出格式
2012-3-26
1
ACM题目特点
由于ACM竞赛题目的输入数据和输出 数据一般有多组(不定),并且格式多 种多样,所以,如何处理题目的输入输 出是对大家的一项最基本的要求。这也 是困扰初学者的一大问题。 下面,分类介绍:
2012-3-26
2
一个超级简单的题目(ex-1):
5
输入第一类:
输入不说明有多少个Input Block, 以EOF为结束标志。 参见:ex-1.
2012-3-26
6
ex-1源代码:
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a, &b) != EOF) printf("%d\n",a+b); }
ACM基本的输入输出练习代码:统计A+B

学号:1400310506 姓名:韦冬妮任课老师:秦兴国A+B for Input-Output Practice(I)#include <stdio.h>int main(){int a,b;while (scanf("%d %d",&a,&b) != EOF) /*EOF直到文件的结尾*/ {printf("%d\n",a+b);}return 0;}(II)#include <stdio.h>int main(){int i;int a,b;scanf("%d",&i); /*输入相加数的组数*/while (i!=0,i--){scanf("%d %d",&a,&b);printf("%d\n",a+b);}return 0;}(III)#include <stdio.h>int main(){int a, b;while(scanf("%d %d",&a, &b)){if(a==0 && b==0) break; /*当a b 都等于0时跳出循环*/else printf("%d\n",a+b);}return 0;(IV)#include<stdio.h>int main(){int i,n,sum;while(scanf("%d",&i) &&i!=0){sum = 0;while(i--){scanf("%d",&n);sum = sum+n;}printf("%d\n",sum);}return 0;}(V)#include<stdio.h>int main(){int n,a,b,i,sum;scanf("%d",&n); /*输入相加的组数*/while(n--){sum=0;scanf("%d",&a); /*输入一组中相加数的个数*/ for(i=1;i<=a;i++){scanf("%d",&b);sum=sum+b;}printf("%d\n",sum);}return 0;}(VI)#include<stdio.h>int main(){int n,a,sum;sum = 0;while(scanf("%d",&n)!=EOF){while(n--){scanf("%d",&a);sum=sum+a;}printf("%d\n",sum);sum=0;}return0;}(VII)#include<stdio.h>int main(){int a,b;while(scanf("%d%d",&a,&b)!= EOF){printf("%d\n\n",a+b);}return0;}(VIII)#include<stdio.h>int main(){int n,i,m,sum,j,a;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&m);sum=0;for(j=0;j<m;j++){scanf("%d",&a);sum=sum+a;}printf("%d\n",sum);if(i != n-1){printf("\n");}return 0;}}。
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--) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入_第四类:
以上几种情况的组合 10364 10365 10366
2010-10-13
21
4源代码: #include<stdio.h>
int main() { int n,sum; while( scanf( "%d" , &n ) && n ) //每组case前有一个控制该组输入数据的数,为0结束 { int x; sum = 0; while( n-- ) //控制该组输入个数 { scanf( "%d" , &x ); sum += x; } printf( "%d\n" , sum ); //一行一个结果 } return 0; }
2010-10-13
24
输入_第五类:
输入是一整行的字符串的 参见:10367
2010-10-13
25
本类输入解决方案:
#include <stdio.h> #include <string.h> int main(void){ int i; char a[15],b[205]; while(1){ gets(a); if(strcmp(a,"ENDOFINPUT")==0) break; gets(b); gets(a);
2010-10-13 6
输入_第一类:
输入不说明有多少个Input Block,以EOF 为结束标志。 参见:10361
2010-10-13
7
源代码:
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) != EOF)
}
printf("%d\n",a+b); return 0;
2010-10-13
8
源代码:
#include<iostream> using namespace std; int main() { int a, b; while(cin >> a >> b) cout<< a + b<<endl; return 0; }
2010-10-13
30
说明续
结合后两个参数,getline可以方便地实现: 用户最多输入指定个数的字符,如果超过, 则仅指定个数的前面字符有效,如果没有超 过,则用户可以通过回车来结束输入。 char name[4]; cin.getline(name,4,'\n'); 由于 endchar 默认已经是 '\n',所以后面那 行也可以写成: cin.getline(name,4);
28
2010-10-13
说明:
scanf(“ %s%s”,str1,str2),在多个字符串之 间用一个或多个空格分隔; 若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。 通常情况下,接受短字符用scanf函数,接 受长字符用gets函数。 而getchar函数每次只接受一个字符,经常 c=getchar()这样来使用。
2010-10-13
27
本类输入解决方案:
C语法: char buf[20]; gets(buf); C++语法: 如果用string buf;来保存: getline( cin , buf ); 如果用char buf[ 255 ]; 来保存: cin.getline( buf, 255 );
源代码:
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) &&(a||b))
}
printf("%d\n",a+b); return 0;
2010-10-13
18
源代码:
#include<iostream> using namespace std; int main() { int a,b;
26
2010-10-13
本类输入解决方案:
}
} return 0;
for(i=0;b[i]!='\0';i++){ if(b[i]>=65&&b[i]<=90){ b[i]-=5; if(b[i]<65) b[i]+=26; } printf("%c",b[i]); } printf("\n");
2010-10-13 2
评测系统反馈:
Runtime Error (RE) : 运行错。你的程序在运行结束之前由于 段错误(Segmentation fault)、访问冲突(ACCESS VIOLATION )、数组下标超出范围(ARRAY BOUNDS EXCEEDED )、浮点 异常(FLOAT POINT EXCEPTION)或其他类是错误、除零错误 (DIVISION BY ZERO)、栈溢出(STACK OVERFLOW)等。请 仔细检查程序中类似的错误。 Memory Limit Exceeded (MLE) :超内存。你的程序试图使用 超过评测系统规定大小的内存。 Output Limit Exceeded (OLE) : 超输出。你的程序输出了过 多的信息。这通常意味着你的程序陷入了一个带输出的无限循 环中。
2010-10-13 29
说明:cin.getline的用法:
getline 是一个函数,它可以接受用户的输入的字符,直到已 达指定个数,或者用户输入了特定的字符。它的函数声明形 式(函数原型)如下: istream& getline(char line[], int size, char endchar = '\n'); 不用管它的返回类型,来关心它的三个参数: char line[]: 就是一个字符数组,用户输入的内容将存入在 该数组内。 int size : 最多接受几个字符?用户超过size的输入都将不被 接受。 char endchar :当用户输入endchar指定的字符时,自动结束。 默认是回车符。
2010-10-13 13
#include<iostream> using namespace std; int main() { int n,a, b; cin>>n; while(n--) { cin >> a >> b; cout<< a + b<<endl; } return 0; }
2010-10-13
3
评测系统反馈:
Compile Error (CE) : 编译错。编译器无法成功地编译你的程 序,错误信息将返回给用户。编译过程中产生的警告信息不会 导致此错误。 System Error:系统错。比如你的程序需要超过了硬件限制的内 存。
2010-10-13
4
先看一个超级简单的题目:
14
2010-10-13
本类输入解决方案:
2010-10-13
C语法: scanf("%d",&n) ; for( i=0 ; i<n ; i++ ) { .... } C++语法: cin >> n; for( i=0 ; i<n ; i++ ) { .... }
15
输入_第三类:
输入不说明有多少个Input Block,但以 某个特殊输入为结束标志。 参见:10363 3
2010-10-13
16
源代码:
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) &&(a!=0 && b!=0))
上面的程序有什么问题?
2010-10-13 17
}
printf("%d\n",a+b); Return 0;
10000 Sample input: 10 20 Sample output: 30
2010-10-13
5
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a + b << endl; return 0; }
2010-10-13 9
本类输入解决方案:
C语法: while(scanf("%d %d",&a, &b) != EOF) { .... } C++语法: while( cin >> a >> b ) { .... }
2010-10-13 10
说明(1):
1.
Scanf函数返回值就是读出的变量个数, 如:scanf( “%d %d”, &a, &b ); 如果只有一个整数输入,返回值是1, 如果有两个整数输入,返回值是2,如 果一个都没有,则返回值是-1。 EOF是一个预定义的常量,等于-1。