jiazihao2022 2023-10-19 23:37 采纳率: 50%
浏览 11
已结题

c++【信息学奥赛一本通】1407

1407:*小猴

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 46687 通过数: 18405
【题目描述】
*小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设maxn
是单词中出现次数最多的字母的出现次数,minn
是单词中出现次数最少的字母的出现次数,如果maxn−minn
是一个质数,那么*小猴就认为这是个Lucky Word
,这样的单词很可能就是正确的答案。

【输入】
只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100

【输出】
共两行,第一行是一个字符串,假设输入的的单词是Lucky Word
,那么输出“Lucky Word
”,否则输出“No Answer
”;

第二行是一个整数,如果输入单词是Lucky Word
,输出maxn−minn
的值,否则输出0

【输入样例】
error
【输出样例】
Lucky Word
2
【提示】
样例输入:

样例 #2:

olympic
样例输出:

样例 #2:

No Answer
0

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int ans[26];
    char a[110]={0};
    int l,mmin,mmax,date;
    scanf("%s",a);
    l=strlen(a);
    for(int i=0;i<l;i++)
        ans[a[i]-'a']++;
    mmin=10000;mmax=0;
    for(int i=0;i<26;i++)
    {
    if(ans[i]>mmax)
    mmax=ans[i];
    if(ans[i]<mmin&&ans[i]!=0)
    mmin=ans[i];
    }
    date=mmax-mmin;
    if(date==0||date==1)
    {
        printf("No Answer\n0\n");
        return 0;
    }
    for(int h=2;h*h<=date;h++)
        if(date % h==0)
        {
            printf("No Answer\n0\n");
            return 0;
        }
        printf("Lucky Word\n");
        cout<<mmax-mmin;
        return 0;
}

img

请问各位博客我哪里错了?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-20 12:51
    关注

    【以下回答由 GPT 生成】

    根据题目描述,这是一个关于计算最大最小字母次数的质数差值问题。下面是解决该问题的具体步骤和代码示例。

    步骤: 1. 声明一个长度为26的整数数组ans,用于存储字母次数。 2. 声明一个长度为110的字符数组a,用于存储输入的单词。 3. 读取输入的单词到字符数组a中。 4. 计算单词长度,并初始化mmin和mmax为一个较大或较小的初始值(比如10000和0)。 5. 遍历字符数组a,统计每个字母出现的次数,更新mmin和mmax的值。 6. 根据统计结果计算maxn和minn的差值date。 7. 判断date是否等于0或1,如果是,则输出"No Answer"和0。 8. 使用循环遍历2到(date的平方根),判断date是否可以被整除,如果是,则输出"No Answer"和0。 9. 当前日期是质数,输出"Lucky Word"。 10. 输出maxn和minn的差值date。

    以下是示例代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
        int ans[26];
        char a[110]={0};
        int l,mmin,mmax,date;
        scanf("%s",a);
        l=strlen(a);
        for(int i=0;i<l;i++)
            ans[a[i]-'a']++;
        mmin=10000;mmax=0;
        for(int i=0;i<26;i++)
        {
            if(ans[i]>mmax)
                mmax=ans[i];
            if(ans[i]<mmin&&ans[i]!=0)
                mmin=ans[i];
        }
        date=mmax-mmin;
        if(date==0||date==1)
        {
            printf("No Answer\n0\n");
            return 0;
        }
        for(int h=2;h*h<=date;h++)
            if(date % h==0)
            {
                printf("No Answer\n0\n");
                return 0;
            }
        printf("Lucky Word\n");
        cout<<mmax-mmin;
        return 0;
    }
    

    上述代码会根据输入的单词返回相应的结果。如果输入的单词是"Lucky Word",则会输出"Lucky Word"和maxn-minn的值;如果不是,则会输出"No Answer"和0。

    希望能帮到你!如果还有其他问题,请随时提问。



    【相关推荐】


    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7679590
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月19日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址