美文网首页互联网科技大数据程序员
NOIP 2018普及组复赛第1题答案详解

NOIP 2018普及组复赛第1题答案详解

作者: 海天一树X | 来源:发表于2018-11-21 20:18 被阅读39次
    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

    相关文章

      网友评论

        本文标题:NOIP 2018普及组复赛第1题答案详解

        本文链接:https://www.haomeiwen.com/subject/vdlhqqtx.html