字符串模拟入门

如题(水题大集锦)

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
原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7787719.html