• 洛谷 P1906 凯撒密码 题解


    原题链接

    好吧,这是道冷门的题目,无意间被我找到

    开始看到这道题,好迷茫

    偏移量是什么呢?

    题目说明更是让我疑惑不已

    问了度娘才知道

    第二条说明是英语构词中,字母出现频率的一个排行榜

    ("e"在英语单词中出现频率最高)

    那么题目的意思就是:

    把第一句暗文中出现最多的字母翻译为"e(E)",求出偏移量t

    这样一来题目就简单了

    我的代码思路呢,就是将问题分解,用自定义函数解决小问题

    那么这道题就需要

    ①输入

    ②求t

    ③翻译

    ④储存

    ⑤输出

    但还需要注意的是

    所以可以先写下这段代码

    void change(string &s)//将小写转为大写 
    {
        int i;
        int len=s.size();
        for(i=0;i<len;i++)
        {
            if(s[i]>='a'&&s[i]<='z')
            s[i]-=32;
        }
    }

    这段代码也不难写

    void translate(string &s,int t)//假设已知t,传址翻译暗文
    {
        int len=s.size();
        for(int i=0;i<len;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                s[i]+=t;//有左移和右移两种移法,那t就有正负两种情况 
                if(s[i]>'Z') s[i]-=26; 
                if(s[i]<'A') s[i]+=26;//所以这里要有两个边界判断 
            }
        }
    }

    然后就是

    求出t

    int f(string s)
    {
        int i,len=s.size();
        for(i=0;i<len;i++)
        v[(int)s[i]]++;
        int maxn=0,j;
        for(i='A';i<='Z';i++)
        {
            if(v[i]>maxn)
            {
                maxn=v[i];
                j=i;
            }
        }
        int ans='E'-j;//"E"是翻译成的明文,求偏移量用"E"-某出现最多字母 
        return ans;
    }

    最后呢,就是这道题的输入要注意一下(当然是用"while(cin>>...)")

    表示苯蒟蒻在这里卡了半天

    可能你们都知道cin后用getline会把空格和回车读入

    如果直接打回车,这个getline就结束了(做了这道题后我才知道)

    所以要打两个getline

    那代码就是这样

    #include<bits/stdc++.h>
    using namespace std;
    string a,s,e,ans[50];
    int num,v[150],t;
    void change(string &s)//将小写转为大写 
    {
        int i;
        int len=s.size();
        for(i=0;i<len;i++)
        {
            if(s[i]>='a'&&s[i]<='z')
            s[i]-=32;
        }
    }
    void translate(string &s,int t)
    {
        int len=s.size();
        for(int i=0;i<len;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                s[i]+=t;//有左移和右移两种移法,那t就有正负两种情况 
                if(s[i]>'Z') s[i]-=26; 
                if(s[i]<'A') s[i]+=26;//所以这里要有两个边界判断 
            }
        }
    }
    int f(string s)
    {
        int i,len=s.size();
        for(i=0;i<len;i++)
        v[(int)s[i]]++;
        int maxn=0,j;
        for(i='A';i<='Z';i++)
        {
            if(v[i]>maxn)
            {
                maxn=v[i];
                j=i;
            }
        }
        int ans='E'-j;//"E"是翻译成的明文,求偏移量用"E"-某出现最多字母 
        return ans;
    }
    int main()
    {
        while(cin>>s,getline(cin,a),getline(cin,a),cin>>e)
        {
            change(a);
            num++;
            if(num==1)//t根据第一句话来求
            t=f(a);
            translate(a,t);
            ans[num]=a;
        }
        for(int i=1;i<=num;i++)
        cout<<ans[i]<<endl;
        return 0;
    }

     了解凯撒密码的,可以点这里

  • 相关阅读:
    Codeforces 514C Watto and Mechanism(字典树)
    计蒜客 直线的交点(计算几何 + 逆序对)
    Codeforces 837D Round Subset(背包)
    计蒜客 商汤科技的行人检测(随机化+计算几何)
    HDU 5893 List wants to travel(树链剖分+线段树)
    操作系统的中断处理
    Linux 安装 webmin
    Fedora 安装 phpMyAdmin(可能只有自己看得懂)
    httpd编译安装php
    IA-32e架构下的内核初始化内存管理
  • 原文地址:https://www.cnblogs.com/zhouzhihao/p/10290081.html
Copyright © 2020-2023  润新知