第一类
:输入不说明有多少个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 + 10
char 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 + 10
using 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