ACM竞赛之输入输出

http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetailios

 

比赛描述函数

字符串的输入输出处理。测试

 

输入spa

 

第一行是一个正整数N,最大为100。code

以后输入多行字符串(行数大于N),  每一行字符串可能含有空格,且字符数不超过1000。blog

 

输出ci

 

对于前N行字符串,按原样输出;字符串

对于其他的字符串以空格符为分割依次按行输出。get

注意:每行输出之间均要输出一个空行。io

 

样例输入

2

N U P Ter

样例输出



N

U

P

Ter

 

提示

 

对于输入输出仍有困惑的同窗请仔细阅读如下内容:

 

在ACM竞赛中,对于数据的读入,通常有如下四种状况:

 

1、四种基本输入形式:

 

1. 单组输入数据

 

示例:整数求和

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1001

 

C语言:

1 #include <stdio.h>
2 int main()
3 {
4     int a,b;
5     scanf("%d %d",&a, &b);
6     printf("%d\n",a+b);
7 }

 

 

C++:

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5     int a,b;
6     cin>>a>>b;
7     cout<<a+b<<endl;
8     return 0;
9 }

 

注意:输入前无需也不要输出任何提示信息。

 

2. 多组输入数据,且不说明多少组,直到读至输入文件末尾为止

 

示例:A + B Problem (1)

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1084

 

C语言:

1 #include<stdio.h>
2 int main()
3 {
4     int a,b;
5     while(scanf("%d %d",&a,&b) != EOF)
6         printf("%d\n",a+b);
7     return 0;
8 }

 

说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );若是只有输入了一个整数,返回值是1,若是输入了两个,返回值是2,若是一个都没有,则返回值是EOF。EOF是一个预约义的常量,等于-1

 

C++:

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5     int a,b;
6     while(cin>>a>>b)
7         cout<<a+b<<endl;
8     return 0;
9 }

 

说明:表达式cin >> m >> n在读入发生错误返回0,不然返回cin的地址。

 

 

3. 多组输入数据,不说明多少组,以某特殊输入为结束标志。

 

示例:A + B Problem (2)

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1085

 

C语言:

 1 #include<stdio.h>
 2 int main()
 3 { 
 4     int a,b;
 5     while(scanf("%d %d",&a,&b)!=EOF)
 6     {
 7             if(a==0&&b==0)
 8                 break;
 9          printf("%d\n",a+b);
10     }
11     return 0;
12 }

 

C++:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a,b;
 6     while(cin>>a>>b)
 7     {
 8         if(a==0&&b==0)
 9             break;
10         cout<<a+b<<endl;
11     }
12     return 0;
13 }

 

说明:当读入的a与b同时为0时,程序终止;

 

 

4. 多组输入数据,开始输入一个T,接下来是T组数据

 

示例:A + B Problem (3)

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1086

 

C语言:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int T;
 5     int a,b;
 6     scanf("%d",&T);
 7     while(T--)
 8     {
 9         scanf("%d%d",&a,&b);
10         printf("%d\n",a+b);
11     }
12     return 0;
13 }

 

 

C++:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int T;
 6     int a,b;
 7     cin>>T;
 8     while(T--)
 9     {
10         cin>>a>>b;
11         cout<<a+b<<endl;
12     }
13     return 0;
14 }

 

说明:当T组数据处理完后,程序终止;

 

关于字符串的读入,这里再作专门讨论:

 

2、字符串输入

  对字符串的输入分三种状况:

  

 

    一、每一个字符串中不含空格、制表符及回车

  这种状况,用scanf函数是再好不过的了;

 

例如:要读入字符串"abcdef"

那么只要:

char str[10]; 

  

scanf("%s",str); 

 

说明:scanf函数读入字符串时,是以空格、制表符及回车做为不一样字符串之间的分隔符的;

 

 

  二、字符串中含有空格、制表符,但不含回车

  对于这种状况不能使用scanf,而应该使用gets函数;

 

例如:要读入字符串 "Hello world!"

那么只要:

  char str[10];

  

 gets(str);  

 

 

说明:gets函数读入字符串时,只以回车做为不一样字符串之间的分隔符;另外,若是要用gets读入多个字符串,能够写成 while(gets(str)){......}

 

 

  三、字符串中含回车

  在这种状况下,若是没有题目的说明,程序没法知道哪里是字符串的分界。那么,用scanf("%c",&ch)来读,一边读,一边判断分界条件是否知足,若是知足,则把当前读到的东西存到一个字符串中。

 

3、输出处理

 

通常来说,输出处理通常只有两个问题:空行打印问题与浮点数的精度问题;

 

 1. 关于空行(Blank line)

    不少题目都要求在输出数据的恰当位置加空行。一个空行就是一个单独的"\n"。这里,有的题目说:“After each test case, you should output one blank line”,而有的题目说:“Between each test case, you should ouput one blank line”。要注意After和Between的区别,由于若是多了一或少了空行,将致使Presentation Error甚至Wrong Answer。

 

(1)After

这种状况最简单,只须要输出结果后,再加一个printf("\n"),:

 

示例:A + B Problem (4)

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1087

 

C语言:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n,sum,a;
 5     while(scanf("%d",&n) && n)
 6     {
 7          sum=0;
 8          while(n--)
 9          {
10              scanf("%d",&a);
11              sum+=a;
12          }
13          printf("%d\n",sum);
14          printf("\n");
15     }
16     return 0;
17 }

 

C++:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,sum,a;
 6     while(cin>>n&&n)
 7     {
 8          sum=0;
 9          while(n--)
10          {
11              cin>>a;
12              sum+=a;
13          }
14          cout<<sum<<endl;
15          cout<<endl;
16     }
17     return 0;
18 }

 

 

(2)Between

Between和After不一样的是,最后一组结果后面不该该再加单独的"\n",应该像这样:

1 int i;
2 for (i = 0; i < 10; i++)
3 {
4     printf("%d\n", a);
5     if (i != 9)
6         printf("\n");
7 }

 

因为有时候咱们并不知道测试数据有几组(好比测试数据是以end of file 结束的),用上面的方法就不行了,因而,能够换一种写法:

 1 int a;
 2 bool first = true;
 3 while(scanf("%d", &a) == 1)
 4 {
 5     if (!first)
 6         printf("\n");
 7     else
 8         first = false;
 9     printf("%d\n", a);
10 }

 

这样,从第二组测试数据起,在输出每组测试数据的结果以前就会输出一个空行,和想要的效果是同样的。

 

 2.关于精度

 

 (1)结果保留x位小数

这种比较简单,只要 printf("%.xf\n",ans);  便可;

 

例如,要求保留6位小数: printf("%.6f\n",ans);

 

 (2)没有说明要求保留几位,但要求与结果的偏差不大于1e-x;

解决 : printf("%.(x+3)f\n",ans);

 

例如:要求与结果的偏差不大于1e-9 : printf("%.12f\n",ans);

 

 

 

 

题目来源

NUPT

相关文章
相关标签/搜索