ACM输入输出技术总结
来源:互联网 发布:linux 卸载openjdk 编辑:程序博客网 时间:2024/06/12 06:19
输入:
第一类:输入不说明有多少个InputBlock,以EOF为结束标志。
例子:HDOJ_1089(http://acm.hdu.edu.cn/showproblem.php?pid=1089)
C:
#include<cstdio>int main(){ int a, b; while(scanf("%d%d",&a, &b) != EOF) { printf("%d\n",a + b); }}说明:int scanf( const char *format, ... ); 返回输入数据个数,没有则返回EOF(-1)。C++:
#include<iostream>using namespace std;int main(){ long a,b; while(cin >> a >> b) { cout << a + b << endl; } return 0;}第二类:输入一开始就会说有N个Input Block,下面接着是N个Input Block。
例子:HDOJ_1090 (http://acm.hdu.edu.cn/showproblem.php?pid=1090)
C:
#include<cstdio>int main(){ int a,b,n,i; scanf("%d",&n); for(i = 0; i < n; i++) { scanf("%d%d",&a,&b); printf("%d\n",a + b); } return 0;}
C++:#include<iostream>using namespace std;int main(){ long a,b,n; cin >> n; while(n--) { cin >> a >> b; cout << a + b << endl; } return 0;}第三类:输入不说明有多少个Input Block,但以某个特殊输入为结束标志。
例子:HDOJ_1091(http://acm.hdu.edu.cn/showproblem.php?pid=1091)
C:
#include<cstdio>int main(){ int a,b; while(scanf("%d%d",&a,&b)) { if(0 == a && 0 == b) break; printf("%d\n",a + b); } return 0;}注意:while(scanf("%d %d",&a,&b) &&(a!=0 && b!=0)) 由于&&运算符是短路运算,所以,如果你输入的是0 5,输入正确,a!= 0为假,整个逻辑表达式的值就为假,跳出结束程序,与题目输入规则相矛盾!
C++:#include<iostream>using namespace std;int main(){ int a, b; while(cin >> a >> b) { if(0 == a && 0 == b) break; cout << a + b << endl; } return 0;}第四类:以上三类的组合。
例子:
HDOJ_1092(http://acm.hdu.edu.cn/showproblem.php?pid=1092)
C:
#include<cstdio>int main(){ int tmp,sum,n,i; while(scanf("%d",&n)) { if(0 == n) break; sum = 0; for(i = 0; i < n; i++) { scanf("%d",&tmp); sum += tmp; } printf("%d\n",sum); } return 0;}
C++:#include<iostream>using namespace std;int main(){ int tmp,sum,n,i; while(cin >> n) { if(0 == n) break; sum = 0; for(i = 0; i < n; i++) { cin >> tmp; sum += tmp; } cout << sum << endl; } return 0;}HDOJ_1093(http://acm.hdu.edu.cn/showproblem.php?pid=1093)
C:
#include<cstdio>int main(){ int n,k,tmp,sum; scanf("%d",&n); while(n--) { sum = 0; scanf("%d",&k); while(k--) { scanf("%d",&tmp); sum += tmp; } printf("%d\n",sum); } return 0;}
C++:#include<iostream>using namespace std;int main(){ int n,k,tmp,sum,i,j; cin >> n; for(i = 0; i < n; i++) { sum = 0; cin >> k; for(j = 0; j < k; j++) { cin >> tmp; sum += tmp; } cout << sum << endl; } return 0;}HDOJ_1094(http://acm.hdu.edu.cn/showproblem.php?pid=1094)
C:
#include<cstdio>int main(){ int n,tmp,sum; while(scanf("%d",&n) == 1) { sum = 0; while(n--) { scanf("%d",&tmp); sum += tmp; } printf("%d\n",sum); } return 0;}
C++:#include<iostream>using namespace std;int main(){ int n,tmp,sum,i; while(cin >> n) { sum = 0; for(i = 0; i < n; i++) { cin >> tmp; sum += tmp; } cout << sum << endl; } return 0;}第五类:输入的是一整行字符串
例子:HDOJ_1048(http://acm.hdu.edu.cn/showproblem.php?pid=1048)
C:
#include<cstdio>#include<cstring>#include<cctype>#define MAX 1000 + 10char buf[MAX],fs[15] = "START",fe[15] = "END",fend[15] = "ENDOFINPUT";int main(){ int i; //while(fgets(buf,sizeof(buf),stdin)) while(gets(buf)) { if( strcmp(buf,fs) == 0 || strcmp(buf,fe) == 0 ) continue; if(strcmp(buf,fend) == 0) break; i = 0; while(buf[i] != '\0') { if(isalpha(buf[i])) printf("%c",(buf[i] - 'A' + 21) % 26 + 'A'); else printf("%c",buf[i]); i++; } printf("\n"); //printf("%s\n",buf); }}注意:gets(s)会存在缓冲区溢出漏洞,一般ACM或在线OJ都尽量避免这个漏洞的出现,如果出现RE,可能就是缓冲区漏洞溢出,可以使用fgets(buf,MAXN,fin),这个方法会连同换行回车一起读入,如果读文件到文件尾时没有回车,就没有读入回车。
C++:#include<iostream>#include<cctype>#include<string>#define MAX 1000 + 10using namespace std;string buf;int main(){ int i; string fs,fe,fend; fs = "START"; fe = "END"; fend = "ENDOFINPUT"; while(getline(cin,buf)) { if(buf == fs || buf == fe) { //getline(cin,buf); continue; } if(buf == fend) break; for(i = 0; i < buf.length(); i++) { if(isalpha(buf[i])) buf[i] = (buf[i] - 'A' + 21) % 26 + 'A'; } cout << buf << endl; //getline(cin,buf); } return 0;}注意:如果用char [255]保持,可以使用cin.getline(char,255),上述使用了string进行保存一般来说,读入一行的可以使用以上方法,如果读入一个字符串,可以使用scanf("%s",str);或者cin << str;读者可以根据题目自行分析,如果使用C语言中的getc(char)或者scanf("%c",chr),则会读入空格,回车,这个的地方要注意。
练习:
HDOJ_1013(http://acm.hdu.edu.cn/showproblem.php?pid=1013)
HDOJ_1018(http://acm.hdu.edu.cn/showproblem.php?pid=1018)
输出:
第一类:一个Input Block对应的一个Output Block,Output Block之间没有空行。
例子:HDOJ_1089(代码以及输出请浏览上面输入第一类的例子)
语法:
C: printf("%d\n",ans);
C++:cout << ans << endl;
第二类:一个Input Block对应一个Output Block,每个Output Block之后都有空行。
例子:HDOJ_1095(http://acm.hdu.edu.cn/showproblem.php?pid=1095)
C:
#include<cstdio>int main(){ int a,b; while(scanf("%d%d",&a,&b) == 2) { printf("%d\n\n",a + b); } return 0;}
C++:#include<iostream>using namespace std;int main(){ int a,b; while(cin >> a >> b) { cout << a + b << endl << endl; } return 0;}第三类:一个Input Block对应一个Output Block,Output Block之间有空行。
例子:HDOJ_1096(http://acm.hdu.edu.cn/showproblem.php?pid=1096)
C:#include<cstdio>int main(){ int n,i,j,k,sum,tmp; scanf("%d",&n); for(i = 1; i <= n; i++) { scanf("%d",&k); sum = 0; for(j = 0; j < k; j++) { scanf("%d",&tmp); sum += tmp; } printf("%d\n",sum); if(i != n) printf("\n"); } return 0;}
C++:#include<iostream>using namespace std;int main(){ int i,j,k,sum,tmp,n; cin >> n; for(i = 1; i <= n; i++) { cin >> k; sum = 0; for(j = 0; j < k; j++) { cin >> tmp; sum += tmp; } cout << sum << endl; if(i != n) cout << endl; } return 0;}
练习:HDOJ_1016:http://acm.hdu.edu.cn/showproblem.php?pid=1016
HDOJ_1017:http://acm.hdu.edu.cn/showproblem.php?pid=1017
学有余力的读者可以尝试一下题目:(作者如完成一道便在对应题目加上超链接)HDOJ:
1016-1018、1013、1061、1170、2000-2043
本文代码测试均在codeblocks下测试成功,并且在HDOJ能AC。
如有转载,请申明转载地址。
转载地址为:http://blog.csdn.net/wyrhero/article/details/8944542
- ACM输入输出技术总结
- ACM输入输出技术总结
- ACM输入输出格式总结
- acm 输入输出总结
- ACM---输入输出训练总结
- ACM输入输出
- ACM 输入输出
- acm 输入输出
- acm输入输出
- ACM输入输出
- ACM输入输出
- ACM输入输出
- ACM 输入输出方法总结 完整版 已调试通过 可运行
- 输入输出技术
- 关于ACM的输入输出
- ACM之输入输出
- ACM的输入输出
- ACM入门之输入输出
- Java Servlet学习一
- 第十一周任务四多重继承
- 【解决方法】win7 x64 vs中sql语句连接 ora-12154:tns:无法解析指定的连接标识符
- 中文搜索引擎技术揭密
- Android2.3系统的overscroll效果 下滑的时候出现系统的效果
- ACM输入输出技术总结
- 个人博客wordpress搭建之进阶篇
- 文件函数《HTML 5应用开发实践指南》读书笔记
- 表单提交及关闭当前页面并刷新数据《DWZ三》
- 决策树ID3分类算法的C++实现
- Apache Subversion 1.8.0
- Qt的qmake脚本编写
- openwrt u盘扩容 程序装U盘
- Leetcode:Remove Element