【字符串】蒟蒻&LuoGu

目录

笨小猴[P1125]

口算练习题[P1957]


笨小猴[P1125]

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

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

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 100。

输出格式

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

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

样例#1

  • 样例输入 #1

                error

  •  样例输出 #1

                Lucky Word
                2

样例 #2

  • 样例输入 #2

                olympic

  • 样例输出 #2

                No Answer
                0

思路:并不困难。只需要统计单词中每个字母的出现次数,确定其中最大值与最小值之后将两者做差,再判断其是否为质数。通过判断是否为质数来确定输出语句即可。

#include<stdio.h>

int main()
{
    int a[26] = {0},maxn = 0,minn = 105,kase = 0;
    char str[55];
    scanf("%s",str);
    for(int i = 0;str[i]!=0;i++)
        a[str[i]-97]++;
    for(int i = 0;i<26;i++){
        if(a[i]==0) continue;
        if(a[i]>maxn)   maxn = a[i];
        if(a[i]<minn)   minn = a[i];
    }
    int t = maxn - minn;
    for(int i = 2;i*i<=t/2;i++)
        if(t % i ==0||t == 0||t == 1){
            kase++;
            break;
        }
    (kase==0&&t!=1&&t!=0)?printf("Lucky Word\n%d",t):printf("No Answer\n0");
    return 0;
}

a[0]至a[25]是用桶排序分别储存a,b,c…z的出现次数。


口算练习题[P1957]

题目描述

王老师正在教简单算术运算。细心的王老师收集了 i 道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如 5+8 的算式最好只要输入 5 和 8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 5+8=13 以及该算式的总长度 6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。

输入格式

第一行一个整数 i 。

接着的 i 行为需要输入的算式,每行可能有三个数据或两个数据。

若该行为三个数据则第一个数据表示运算类型,a 表示加法运算,b 表示减法运算,c 表示乘法运算,接着的两个数据表示参加运算的运算数。

若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。

输出格式

输出 2*i 行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度。

样例

  • 样例输入

        4
        a 64 46
        275 125
        c 11 99
        b 46 64

  • 样例输出

        64+46=110
        9
        275+125=400
        11
        11*99=1089
        10
        46-64=-18
        9

  • 提示

  1. 第一个算式一定有三个数据。
  2. 对于所有数据,0<i<=50,运算数为非负整数且小于 10000。

蒟蒻思路:每次输入两或三个字符串。通过判断第一个字符串的第0号元素是否为a/b/c来决定是否输入三个字符串,同时决定是否进行上一次类型的运算。每一次运算都是先获得两个数字的长度、其对应的整形以及它们的和、差或积。再根据结果的情况计算出输出语句的长度,最后输出即可。对于不输入字母的情况,只需要定义全局变量,每进行一次运算,就将其更改为特定的值,这样当没有输入abc的时候只需要根据全局变量的值进行选择分支就可以。

#include<stdio.h>

int kase = 0;

void add_work(char str2[6],char str3[6]){
    kase = 1;
    int i,len2,len3,len4 = 1,m = 0,n = 0;
    for(i = 0;str2[i]!='\0';i++){
        m*=10;
        m+=str2[i]-48;
    }
    len2 = i;
    for(i = 0;str3[i]!='\0';i++){
        n*=10;
        n+=str3[i]-48;
    }
    len3 = i;
    int k = m+n;
    if(k!=0)
        for(len4 = 0;k!=0;len4++)
            k/=10;
    printf("%s+%s=%d\n%d\n",str2,str3,m+n,len2+len3+len4+2);
}
void minus_work(char str2[6],char str3[6]){
    kase = 2;
    int i,len2,len3,len4 = 1,m = 0,n = 0;
    for(i = 0;str2[i]!='\0';i++){
        m*=10;
        m+=str2[i]-48;
    }
    len2 = i;
    for(i = 0;str3[i]!='\0';i++){
        n*=10;
        n+=str3[i]-48;
    }
    len3 = i;
    int k = m-n>=0?m-n:n-m;
    if(k!=0)
        for(len4 = 0;k!=0;len4++)
            k/=10;
    printf("%s-%s=%d\n%d\n",str2,str3,m-n,(m-n>=0)?len2+len3+len4+2:len2+len3+len4+3);
}
void multiply_work(char str2[6],char str3[6]){
    kase = 3;
    int i,len2,len3,len4 = 1,m = 0,n = 0;
    for(i = 0;str2[i]!='\0';i++){
        m*=10;
        m+=str2[i]-48;
    }
    len2 = i;
    for(i = 0;str3[i]!='\0';i++){
        n*=10;
        n+=str3[i]-48;
    }
    len3 = i;
    int k = m*n;
    if(k!=0)
        for(len4 = 0;k!=0;len4++)
            k/=10;
    printf("%s*%s=%d\n%d\n",str2,str3,m*n,len2+len3+len4+2);
}
int main()
{
    int n;
    char str1[6],str2[6],str3[6];
    scanf("%d",&n);
    for(int i = 0;i<n;i++){
        scanf("%s",str1);
        if(str1[0]=='a'||str1[0]=='b'||str1[0]=='c'){
            scanf("%s",str2);
            scanf("%s",str3);
            if(str1[0]=='a')
                add_work(str2,str3);
            else if(str1[0]=='b')
                minus_work(str2,str3);
            else if(str1[0]=='c')
                multiply_work(str2,str3);
        }
        else{
            scanf("%s",str2);
            if(kase==1)
                add_work(str1,str2);
            else if(kase==2)
                minus_work(str1,str2);
            else if(kase==3)
                multiply_work(str1,str2);
        }
    }
    return 0;
}

感觉还可以改进,但是大脑死机了= =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值