题解 P5015 标题统计 NOIP2018普及组复赛第一题

· · 题解

NOIP2018普及组复赛第一题

P5015标题统计

先吐槽一下,这题的难度和后面的几题完全不在一个频道上啊啊啊

NOIP出题人良心发现?

应该是OIer们rp++溢出了吧(真理

好了,步入正题

字符串

因为涉及到字符串,所以先介绍一下字符串。

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。 通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

说简单一些,就是字符组成的数组(或串)

详见你的编程入门书

代码&讲解

过程做法

字符数组法

#include<cstdio>
#include<cstring>
using namespace std;
char s[101];                //定义字符数组以存储凯凯的作文
int main()
{
    gets(s);    //输入作文
    int l=strlen(s),anslen=0;       //len存储作文的长度,anslen当计数器,统计符合题意的字符的个数
    for(int i=0;i<l;++i)        //逐个枚举,判断这个作文的标题的这个元素是否符合题意
    {
        if(s[i]!=' '&&s[i]!='\n')   //如果不是空格或换行
            ++anslen;           //那么答案+1
    }
    printf("%d",anslen);        //输出答案
    return 0;               //结束程序
}

递归做法



#include<iostream>
#include<string>
using namespace std;

string s;           //存储凯凯那美妙的作文
int len,ans;

int search(int i)           //寻找作文的标题中有多少个字符
{
    if(i==len) return ans;  //递归出口,如果找到尽头就结束,返回main()
    if(s[i]!=' '&&s[i]!='\n')   //如果不是空格或换行
        ans++;          //那么答案+1        
    return search(i+1);     //进入下一个元素的判断
}

int main()
{
    ios::sync_with_stdio(0);    //给iostream加速

    getline(cin,s);     //输入作文
    len=s.length();     //获取凯凯的作文的长度
    cout<<search(0);        //输出答案
    return 0;
}