您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > ACM培新第一讲-ACM入门
ACM程序设计第一讲-ACM入门湖南工学院张新玉zhangxinyu247@163.com如何入门呢?2020/1/12题目特点:由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。下面,分类介绍:2020/1/13先看一个超级简单的题目:•=1089•Sampleinput:•15•1020•Sampleoutput:•6•302020/1/14初学者很常见的一种写法:•#includestdio.h•intmain()•{inta,b;scanf(“%d%d”,&a,&b);Printf(“%d”,a+b);return0;•}2020/1/15有什么问题呢?这就是下面需要解决的问题2020/1/162020/1/17基本输入输出输入_第一类:•输入不说明有多少个InputBlock,以EOF为结束标志。参见:HDOJ_1089•=10892020/1/18Hdoj_1089源代码:#includestdio.hintmain(){inta,b;while(scanf(%d%d,&a,&b)!=EOF)printf(%d\n,a+b);}2020/1/19本类输入解决方案:•C语法:while(scanf(%d%d,&a,&b)!=EOF){....}•C++语法:while(cinab){....}2020/1/110说明(1):1.Scanf函数返回值就是读出的变量个数,如:scanf(“%d%d”,&a,&b);如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。2.EOF是一个预定义的常量,等于-1。2020/1/111输入_第二类:•输入一开始就会说有N个InputBlock,下面接着是N个InputBlock。参见:HDOJ_10902020/1/112Hdoj_1090源代码:#includestdio.hintmain(){intn,i,a,b;scanf(%d,&n);for(i=0;in;i++){scanf(%d%d,&a,&b);printf(%d\n,a+b);}}2020/1/113本类输入解决方案:•C语法:scanf(%d,&n);for(i=0;in;i++){....}•C++语法:cinn;for(i=0;in;i++){....}2020/1/114输入_第三类:•输入不说明有多少个InputBlock,但以某个特殊输入为结束标志。参见:HDOJ_10912020/1/115Hdoj_1091源代码:#includestdio.hintmain(){inta,b;while(scanf(%d%d,&a,&b)&&(a!=0&&b!=0))printf(%d\n,a+b);}2020/1/116上面的程序有什么问题?Hdoj_1091源代码:#includestdio.hintmain(){inta,b;scanf(%d%d,&a,&b);while(a||b){printf(%d\n,a+b);scanf(%d%d,&a,&b);}}2020/1/117本类输入解决方案:•C语法:while(scanf(%d,&n)&&n!=0){....}•C++语法:while(cinn&&n!=0){....}2020/1/118输入_第四类:•以上几种情况的组合HDU1092/1093/10942020/1/119输入_第五类:•输入是一整行的字符串的参见:HDOJ_10482020/1/120•问题描述将字母A变成字母F,B变成字母G等,即变换成其后的第5个字母,而V变成A,W变成B,X变成C等等,原文中的字母按此规律转换,现给出密文,要求输出原文。2020/1/121•输入输入包括多组非空密文,每组密文之间没有空行,密文中所有字母均为大写,并且每组密文包括3部分,每部分由回车键分割。第1部分为:START第2部分为:包含最多200个字符的密文第3部分为:END输入数据结束的最后一行为:ENDOFINPUT•输出对每组密文输出其对应的原文。2020/1/122本类输入解决方案:•C语法:charstr[20];gets(str);•C++语法:如果用stringbuf;来保存:getline(cin,buf);如果用charbuf[255];来保存:cin.getline(buf,255);2020/1/123while(1){gets(strb);//读输入数据的第一行if(strcmp(strb,”ENDOFINPUT”)==0)break;gets(str);//读入数据字符串……//处理数据字符串gets(strb);//读入“END”串}2020/1/124说明:•scanf(“%s%s”,str1,str2),在多个字符串之间用一个或多个空格分隔;•若使用gets函数,应为gets(str1);gets(str2);字符串之间用回车符作分隔。•通常情况下,接受短字符用scanf函数,接受长字符用gets函数。•而getchar函数每次只接受一个字符,经常c=getchar()这样来使用。2020/1/125思考:以下题目属于哪一类输入?2020/1/126输出_第一类:•一个InputBlock对应一个OutputBlock,OutputBlock之间没有空行。参见:HDOJ_10892020/1/127解决方案:•C语法:{....printf(%d\n,ans);}•C++语法:{...coutansendl;}2020/1/128输出_第二类:•一个InputBlock对应一个OutputBlock,每个OutputBlock之后都有空行。参见:HDOJ_1095•2020/1/1291095源代码#includestdio.hintmain(){inta,b;while(scanf(%d%d,&a,&b)!=EOF)printf(%d\n\n,a+b);}2020/1/130解决办法:•C语法:{....printf(%d\n\n,ans);}•C++语法:{...coutansendlendl;}2020/1/131输出_第三类:•一个InputBlock对应一个OutputBlock,OutputBlock之间有空行。参见:HDOJ_10962020/1/1321096源代码•#includestdio.h•intmain()•{•inticase,n,i,j,a,sum;•scanf(%d,&icase);•for(i=0;iicase;i++)•{•sum=0;•scanf(%d,&n);•for(j=0;jn;j++)•{•scanf(%d,&a);•sum+=a;•}•if(iicase-1)•printf(%d\n\n,sum);•else•printf(%d\n,sum);•}•}2020/1/133解决办法:•C语法:for(k=0;kcount;k++){while(…){printf(%d\n,result);}if(k!=count-1)printf(\n);}•C++语法:类似,输出语句换一下即可。2020/1/134课后作业•题目1:输出9*9口诀•题目2:要求输出国际象棋棋盘•题目3:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5•题目5:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+222222020/1/135课后作业•题目1:输出9*9口诀•题目2:要求输出国际象棋棋盘•题目3:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5•题目5:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+222222020/1/136课后作业•题目6:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?•习题:HDU2248,2266,2267,2284,,2291,2292,2298,2256,2201,22692020/1/137
本文标题:ACM培新第一讲-ACM入门
链接地址:https://www.777doc.com/doc-2437125 .html