NOIP 2018普及组复赛第1题答案详解
2018-11-21 本文已影响39人
海天一树X
NOIP 2018普及组复赛第1题.jpg
一、C程序
解法一:用gets()函数
#include <stdio.h>
#include <string.h>
int main()
{
// 将控制台的数据重定向到文件里
freopen("title.in", "r", stdin);
freopen("title.out", "w", stdout);
char s[100];
gets(s);
int total = 0;
printf("%d\n", sizeof(s));
// 这里只能用strlen,不能用sizeof
// 因为sizeof(s)=sizeof(s)/sizeof(char)=100
for(int i = 0; i < strlen(s); i++)
{
if(s[i] != ' ')
{
total++;
}
}
printf("%d", total);
return 0;
}
解法二:用scanf()函数
#include <stdio.h>
#include <string.h>
int main()
{
// 将控制台的数据重定向到文件里
freopen("title.in", "r", stdin);
freopen("title.out", "w", stdout);
char s[100];
// 不能使用scanf("%s",s);因为遇到第一个空格就会结束
// 符号^表示取反,[^\n]表示除了换行符,其他的字符都可以读取
scanf("%[^\n]", s);
int total = 0;
// 这里只能用strlen,不能用sizeof
// 因为sizeof(s)=sizeof(s)/sizeof(char)=100
for(int i = 0; i < strlen(s); i++)
{
if(s[i] != ' ')
{
total++;
}
}
printf("%d", total);
return 0;
}
二、C++程序
#include <iostream>
#include <stdio.h> // freopen和stdin、stdout要用到此头文件
using namespace std;
int main()
{
// 将控制台的数据重定向到文件里
freopen("title.in", "r", stdin);
freopen("title.out", "w", stdout);
string s;
getline(cin, s);
int total = s.length();
// for循环里面的s.length()不要写成total,因为total是不断减小的
for(int i = 0; i < s.length(); i++)
{
if(s[i] == ' ')
{
total--;
}
}
cout << total << endl;
return 0;
}
三、总结
本题考察的知识点有两个:
(1)输入带空格的字符串
常用的scanf和cin,遇到第一个空格就会停止输入。
C语言可以使用gets()输入带空格的字符串。当然使用scanf(“%[^\n]”, s)也可以。
C++可以使用getline()输入带空格的字符串
(2)求字符串的长度
C语言的字符数组可以使用strlen(s);
C++的string可以使用s.length()或s.size()。
少儿编程QQ群:581357582
少儿英语QQ群:952399366
公众号.jpg