hdoj 1039 Easier Done Than Said?

本文深入探讨了一个典型的字符串模拟题,通过C语言实现,重点在于理解并运用vocnt、cocnt等变量来记录连续元音和辅音数量,以及isHaveVo、isac、isShouldNext等布尔变量来判断字符序列是否符合特定规则。通过实例代码展示如何使用逗号表达式优化代码,同时提供了一个简洁高效的解决方案,适用于初学者进阶学习C语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:点击打开链接


典型的字符串模拟题,没有什么算法,注意小细节。

代码中用vocnt记录连续元音个数,用cocnt记录连续辅音个数。

用布尔变量isHaveVo记录是否有元音,初始值赋为fasle

用布尔变量isac记录判断是否没有三个连续的元音或辅音或两个连续相同字母,初始值赋为true

布尔变量isShouldNext是当判断出该字符无法ac的时候终止继续从字符串中往下读字符。

注意gets(), strcmp(), 以及逗号表达式的应用。

(可以不用逗号表达式,为了节省点代码,也是为了巩固下逗号表达式不忘记,有兴趣可以做下百度百科里逗号表达式的题)

int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
看下输出是什么。

好了,不闲扯了,代码0MS,216K, 如下:

#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    bool isHaveVo, isac, isShouldNext;
    char ch[21], plast;
    int vocnt, cocnt;
    while(gets(ch) && strcmp(ch, "end"))
    {
        isac=isShouldNext=true;
        isHaveVo=false;
        vocnt=cocnt=0;
        for(int i=0; i<strlen(ch) && isShouldNext; ++i)
        {
            switch(ch[i])
            {
            case 'a':
            case 'i':
            case 'u':
                (++vocnt, isHaveVo=true);
                if(vocnt==3 || (vocnt==2 && plast==ch[i]))
                {
                    isac=isShouldNext=false;
                    break;
                }
                cocnt=0;
                plast=ch[i];
                break;
            case 'o':
            case 'e':
                (++vocnt, isHaveVo=true);
                if(vocnt==3)
                {
                    isac=isShouldNext=false;
                    break;
                }
                cocnt=0;
                plast=ch[i];
                break;
            default:
                ++cocnt;
                if(cocnt==3 || (cocnt==2 && plast==ch[i]))
                {
                    isac=isShouldNext=false;
                    break;
                }
                vocnt=0;
                plast=ch[i];
                break;
            }//end of switch
        }//end of for

        if(isac && isHaveVo)
            printf("<%s> is acceptable.\n", ch);
        else
            printf("<%s> is not acceptable.\n", ch);
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值