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;
}

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

原文地址:https://www.cnblogs.com/zhouzhihao/p/10290081.html

时间: 2024-10-11 16:46:03

P1906 凯撒密码 题解的相关文章

凯撒密码、GDP格式化输出、99乘法表

1凯撒密码加密plaincode=input('请输入明文:')print('密文:',end='')for i in plaincode:print(chr(ord(i)+3),end='') 2.国家名称 GDP总量(人民币亿元) 中国 ¥765,873.4375澳大利亚 ¥ 78,312.4375 print('国家名称 GDP总量(人民币亿元)')print('{0:''<12}¥{1:''>10,.2f}'.format('中国',765873.4375))print('{0:''&

JAVA第一次实验 ——凯撒密码

课程:Java程序设计 班级:1352 姓名:黄伟业 学号:20135215 成绩:            指导教师:娄嘉鹏  实验日期:2015.4.15 实验密级: 预习程度:  实验时间:19:30~22:30 仪器组次: 必修/选修:选修  实验序号:1 实验名称:             JAVA开发环境的熟悉 一.   实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 二.实验内容 (一)   命令行下Java程序开发

凯撒密码加密解密--JAVA实现(基础)

凯撒密码一种代换密码,据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码.凯撒密码的基本思想是:通过把字母移动一定的位数来实现加密和解密.明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文. 使用JAVA程序实现对明文的加密: package com.qikeyishu.www; public class Kaisapwd { public static void main(String[] args) { char str[]={'a','b'

python学习笔记[1]-凯撒密码

#!/usr/bin/python #FileName:caesar.py #Code:UTF-8 import sys def caesarEnCode(string,tag): ChgString = "" for s in string: if s.islower(): ChgString += chr((ord(s)-ord('a')+tag)%26+ord('a')) elif s.isupper(): ChgString += chr((ord(s)-ord('A')+ta

凯撒密码 史上最难的问题(呃,这是编程题目的名字,不是真的最难.....)

史上最难的问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22160   Accepted: 12165 Description 儒略?凯撒生活在充满危险和阴谋的年代,而其中最艰难的状况莫过于求得生存.于是他发明了最早的密码系统之一,用于军队的消息传递. 假设你是凯撒军团中的一名军官,需要把凯撒发送的消息破译出来,并提供给你的将军.消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息

FreeCodeCamp之凯撒密码

下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码.移位密码也就是密码中的字母会按照指定的数量来做移位.一个常见的案例就是ROT13密码,字母会移位13个位置.由'A' ? 'N', 'B' ? 'O',以此类推. 学习使用String.fromCharCode()和string.charCodeAt()注意第一个为静态方法,不能定义一个字符串然后使用他,像这样myStr.fromCharCode();是错误的,只能是String.fromCharCode(number1,

信息安全加密技术--凯撒密码

凯撒密码技术是一种代替技术,也称作凯撒移位,是最简单的加密方式之一,在密码学中,凯撒密码(或称恺撒加密.恺撒变换.变换加密)是一种最简单且最广为人知的加密技术.它是一种替换加密的技术.这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系.恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码.恺撒密码还在现代的ROT13系统中被应用.但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全. 1.加密公式: 密文=(

poj 1298 史上最难的问题 -- 凯撒密码

史上最难的问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24958   Accepted: 13565 Description 儒略?凯撒生活在充满危险和阴谋的年代,而其中最艰难的状况莫过于求得生存.于是他发明了最早的密码系统之一,用于军队的消息传递. 假设你是凯撒军团中的一名军官,需要把凯撒发送的消息破译出来,并提供给你的将军.消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息

《密码学》 凯撒密码和栅格密码(0)

凯撒密码(0) 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推.这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系. 加密公式:En(x) = (x + n) mod 26 解密公式:Dn(x) = (x -