E - god is a girl

题意

刚开始做这个题一脸懵逼,但是通过观察可以发现一些端倪。
转换的只有大写字符,其他符号(比如“?”,“。”)没有变化

题目给了多组样例,我把解密前称为str1,解密后称为str2.
先打印每个str2[i]-str1[i]的值,貌似可以发现一点迹象.
P1
1 1 2 3 5 8 好像和斐波那契数列有关。。
但只是前一部分,后半部分关系,真的看你推了。

#include<iostream>
#include<string.h>
using namespace std;
char str[1000020];
int f[1000020];
int x;
//int num=0;  去掉注释改为全局,结果WA,一定要改成局部变量,因为有多组test
char a[50]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(){
    f[0]=1;
    f[1]=1;
    for(int i=2;i<1000020;i++)
        f[i]=((f[i-1]%26)+f[i-2]%26)%26;

    //cout<<strlen(a);
    while(gets(str)!=NULL){
        int num=0;
        int len=strlen(str);    
        for(int i=0;i<len;i++){
            if(str[i]<'A'||str[i]>'Z'){
                cout<<str[i];
            }else
            {
                for(int j=0;j<26;j++){
                    if(str[i]==a[j]){
                        x=j;
                        break;
                    }
                }           
                x+=f[num];
                x=x%26;
                cout<<a[x];
                num++;
            }
        }
        cout<<endl;
    }       
    return 0;
}

参考http://blog.csdn.net/chudongfang2015/article/details/52692698
^_^带我飞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值