解密(topscoding)

c++写程序:题目描述
亶亶最近在学习计算机密码学,密码学是一门古老而又年轻的学问,计算机科学的兴起给密码学注入了新的活力。在网络、通信技术高度发达的今天,计算机安全和保密问题显得越来越重要。菅董在学习过程中遇到了这样一个任务:解密一份被加密过的文件。经过研究,莹萱发现了加密文件有如下加密规律(括号中是一个“原文->密文”的例子)
(1)原文中所有的字符都在字母表中被循环左移了三个位置(dec ->abz)
(2)逆序存储(abcd -> dcba )
(3)字母大小写反转(abXY ->ABxy)

输入格式
一个加密的字符串。(长度大于1且小于50且只包含大小写字母)

输出格式
输出解密后的字符串。

样例
输入#1
Helloworld
Copy
输出#1
GOURZROOHk
求解!

从第三步往前逐步解密字符串就可以了。

代码如下:

参考链接:

#include <iostream>
#include <string.h>
using namespace std;

int main(void){
    
    char str[50];
    cin>>str;
//    cout<<str<<endl;
    
    int len=strlen(str);
    
    // 从第三步开始 解密字符串
    // 大小写转换 
    for(int i=0;i<len;i++){
        if(str[i]>='A'&&str[i]<='Z'){
            str[i]=str[i]+32;
            continue; 
        }
        
        if(str[i]>='a'&&str[i]<='z'){
            str[i] = str[i]-32;
        }
    }
    
//    cout<<str<<endl;
    
    // 第二步  逆序 
    for(int i=0;i<len/2;i++){
        
        char ch = str[i];
        str[i]=str[len-1-i];
        str[len-1-i]=ch;
    }
    
//    cout<<str<<endl;
    
    // 第一步 所有字母按字母表顺序右移三位 
    for(int i=0;i<len;i++){
        
        char ch = str[i];
        // http://ascii.wjccx.com/
        if((ch>='a'&&ch<'x')||(ch>='A'&&ch<'X')){
            ch=ch+3;
            str[i]=ch;    
            continue;
        }
        
        if((ch>='x'&&ch<='z')||(ch>='X'&&ch<='Z')){
            ch=ch-23;
            str[i]=ch;    
        } 
        
        
    }
    
    // 打印解密后的字符串 
    cout<<str;
    
    return 0;
} 

img

顺序反过来就行了,先大小翻转,再前后翻转,最后每个字母右移3位(注意XYZxyz对应ABCabc)


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    cin >> str;
    vector<char>v;
    for (int i = 0; i < str.size(); i++)
    {
        //右移三位
        str[i] += 3;

        //处理超出部分
        if (str[i] > 90 && str[i] < 95)
            str[i] -= 26;
        if (str[i] > 122 && str[i] < 126)
            str[i] -= 26;

        //改变大小写
        if (str[i] < 91)
            str[i] += 32;
        else
            str[i] -= 32;

        //放入容器
        v.push_back(str[i]);
    }
    //反转并存入str
    reverse_copy(v.begin(), v.end(), str.begin());
    cout << str;

    system("pause");
    return 0;

}

结果:

img