zoukankan      html  css  js  c++  java
  • 字符串模拟入门

    如题(水题大集锦)

    1.P1914 小书童——密码

    直通

    思路:

      因为是循环的,所以我们进行%26即可

    上代码:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    const int Mod = 26;
    const char e[Mod] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int n;
    string y;
    
    int main() {
        scanf("%d",&n);
        cin>>y;
        int len=y.length();
        for(int i=0,d; i<len; i++) {
            d=(y[i]-'a'+n)%26;
            printf("%c",e[d]);
        }
        return 0;
    }
    View Code

    2.P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…

    (Maybe是Here。。)

    直通

    思路:

      将字符串转化为数字之后,边乘边模即可

    坑点:

      注意ret的初始值应该设置为1,而不是0,因为用到了乘

    上代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int Mod = 47;
    char s[10],p[10];
    
    int UFO(char a[],int len) {
        int ret=1;
        for(int i=0,x; i<len; i++) {
            x=a[i]-'A'+1;
            ret=ret*x%Mod;
        }
        return ret;
    }
    
    int main() {
        cin>>s>>p;
        int lens=strlen(s),lenp=strlen(p);
        if(UFO(s,lens)==UFO(p,lenp)) printf("GO");
        else printf("STAY");
        return 0;
    }
    View Code

    3.P1022 计算器的改良

    直通

    思路:

      我们可以根据一系列操作使得所有常数的和在等号右面,其余的系数之和位于等号左端,即k1*x=k2——>x=k2/k1

      我们可以定义一个p表示x的正负,lef表示在等号的左端还是右端

    坑点:

      ①注意x要初始化为零

      ②注意可能会出现ans=-0的情况。。。(为什么会出现这种情况?强大。。。)

    上代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int k1,k2;
    char q,s[2333];
    
    int main() {
        scanf("%s",s);
        int len=strlen(s);
        s[len]='='; //便于计算最后一步的结果 
        bool p=true,lef=true;
        for(int i=0,x=0; i<=len; i++) {
            if('0'<=s[i] && s[i]<='9') x=x*10+s[i]-'0'; //如果是数,更新x 
            if(s[i]>='a') {
                q=s[i]; //记录出现的字母
                //x==0 ? 1 : x 是处理字母的系数为1的情况 
                k1+=(x==0 ? 1 : x)*(lef ? (p ? 1 : (-1)) : (p ? (-1) : 1));
            }
            if(s[i]=='+' || s[i]=='-' || s[i]=='=') {
                if('0'<=s[i-1] && s[i-1]<='9') //判断一下是否是常数 
                    k2+=x*(lef ? (p ? (-1) : 1) : (p ? 1 : (-1)));
                x=0; //记住这里一定要清零!!! 
                if(s[i]=='=') lef=false; //表示位于右端 
                if(s[i]=='-') p=false;
                else p=true;
            }
        }
        double ans=(double)(k2)/(double)(k1);
        if(ans==0) printf("%c=0.000",q); //可以试一下,如果把这一句注释掉,会出现很奇怪的现象 
        else 
        printf("%c=%.3lf",q,ans);
        return 0;
    }
    View Code
  • 相关阅读:
    luogu P4587 [FJOI2016]神秘数
    luogu P4042 [AHOI2014/JSOI2014]骑士游戏
    luogu P2597 [ZJOI2012]灾难
    一则胡乱科普
    NJU Static Program Analysis 09: Pointer Analysis II
    NJU Static Program Analysis 08: Pointer Analysis I
    NJU Static Program Analysis 07: Interprocedural Analysis
    NJU Static Program Analysis 06: Data Flow Analysis IV
    LianYunGang OI Camp: Contest #2
    NJU Static Program Analysis 05: Data Flow Analysis III
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7787719.html
Copyright © 2011-2022 走看看