【NOIP2018 普及组 】标题统计


本人水平有限,题解不到为处,请多多谅解

本蒟蒻谢谢大家观看


题目
传送门


以下是本人想到的三种方法:



法一:用gets读入,因为gets可以读入任何字符且包括空格,直到 ‘ ’ 换行停止。注意:判断空格时用 ‘ ’,       注 : gets读入的必须是char数组 code:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int p,len=0,i,ans;
 4 char a[1212];
 5 int main()
 6 {
 7 gets(a);
 8 len=strlen(a);
 9 for(int i=0;i<len;i++)
10 if(a[i]==' ')
11 ans++;
12 //cout<<ans<<endl;
13 cout<<len-ans<<endl;
14 }




法二:用getchar读入,getchar也可以读入任何字符且包括空格,其余同上,但是getchar为字符中最高效的,gets易导致堆栈溢出 , getchar读入时要手动在末尾加入

 空格 ‘0’ ,其余读入法均自带。

gerchar读入时若不开char数组,则只读入第一位

code:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int p,len=0,i;
 4 char a[1212];
 5 int main()
 6 {
 7 i=0;
 8 while((a[i]=getchar())!='
')
 9 {
10 i++;    
11 } 
12 a[i]='';
13 i=0; 
14 while(a[i]!='')
15 {    
16 // putchar(a[i]);
17 
18 i++;    
19 if(a[i]==' ')
20 len++;
21 }
22 if(a[0]==' ')  //必须要特判第一位的空格,因为我在while中 i++ 在 if(a[i]==' ') 前面
23 len++;
24 //putchar('
');
25 cout<<i-len<<endl;
26 //cout<<len<<endl;
27 }

 法三:用string读入

其中getline类似于gets 可以读进空格

但string与char最大的不同在于:使用char要先在自变量定义数组,string不需要。使用时,char可以手动+1,使其下标从1开始,但string不行

code:

 1 #include<bits/stdc++.h>
 2 using namespace std; 
 3 int ans,ans2;
 4 string ch;
 5 int main()
 6 {
 7     getline(cin,ch);
 8     int len=ch.size();
 9     //cout<<"len= "<<len<<endl;
10     for(int i=0;i<len;i++){
11         if(ch[i]==' ')ans++;
12     }
13     //if(ch[len+1]==' ')len--;
14     cout<<len-ans<<endl;
15     return 0;
16 }

 本人在交题时发现一个error:

1 for(int i=0;i<len;i++){
2         if(ch[i]==' ')len--;
3     }

上述做法会有些错误hank数据如下
  1  2  (2后有2个空格)

标准输出:2

WA输出:3

至于为什么:到目前为止,我自己还没有完全想清楚,可能是因为len之后的空格在ch中没有体现,导致只记录了总数,后面的空格数没有完全统计到。

若哪位神犇有科学解释,请在此篇博客下放发表评论,本人不胜感激。

以下是正解:

1 for(int i=0;i<len;i++){
2         if(ch[i]==' ')ans++;
3     }

原文地址:https://www.cnblogs.com/nlyzl/p/11264623.html