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;}

第二类:输入一开始就会说有NInput Block,下面接着是NInput 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))  由于&&运算符是短路运算,所以,如果你输入的是

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 






原创粉丝点击