【NOIP2018 普及组 】标题统计
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:传送门
以下是本人想到的三种方法:
法一:用gets读入,因为gets可以读入任何字符且包括空格,直到 ‘\n’ 换行停止。注意:判断空格时用 ‘ ’, 注 : 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())!='\n') 9 { 10 i++; 11 } 12 a[i]='\0'; 13 i=0; 14 while(a[i]!='\0') 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('\n'); 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 }