P1079Vigenère密码
2024-10-07 08:29:57
这是2012年noip提高组的的DAY1T1,我用了一下午的时间,一次性AC^^。
这是一个字符串的模拟题。首先给出了一个密码对应法则,我们发现在同一对角线的明文通过密钥得出来的密文是相同的。根据八皇后,我们可得i+j相同的则为同一个密文。然后可以把序号改成asscii的话,密文-密钥=明文+A/a,这里我是通过强制转成int再转回char实现的。然而第一次我想通过打表来做。那么第二个问题则是要把密钥的长度填充到和明文长度相同,我选用了while嵌套来for密钥以此达到相同长度。第三点则是有小写和大写输出之分,先写一个judge函数判断,分成全大,全小,一大一小(两种)。然后再根据要求一点点写吧~那么这个地方有一个问题,那么就是: 密文是A,密钥Z,这种情况就出现了负数,然后我们就手推几组数据得到+26即可,相当于一个来回。另外一大一小时要先开变量去转换。通过一次次的调试,终于过样例了了,样例答案是这样的:Where is a will,there is a will.
1.做题时一心一意,别乱下位玩,很浪费时间,虽然题太难时坐立不安。
2.写程序时可以再新建一个,用来测试,或者找asscii码等
3.再次说手推样例很重要,一定要心平气和地算。
4.学会类比,比如这个对角线可以类比八皇后,强转换再类比那天机房考试的密码题
5.调试的过程中一定要有信念,出现问题也一定要有决心去解决
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
string k,c;
char kk[],cc[];
bool judge(char x){//判断是否是大写
if(int(x)>=&&int(x)<=){
return true;
}
else return false;
}
int main(){
cin>>k;//秘钥
cin>>c;//明文加密后的密文
int len=c.length();
int len_k=k.length();
int n=;
while(n<=len){//把密钥填充满
for(int i=;i<=len_k-;i++){
kk[n]=k[i];
n++;
}
}
for(int i=;i<=len-;i++){//将最后的密文转成数组
cc[i+]=c[i];
}
/* for(int i=1;i<=len;i++){
cout<<kk[i]<<" "<<cc[i]<<endl;;
}*/
//cout<<endl;
for(int i=;i<=len;i++){
int ques=;
if(judge(cc[i])==true&&judge(kk[i])==true){//全是大写的
if(int(cc[i])-int(kk[i])>=){
ques=int(cc[i])-int(kk[i])+;
cout<<char(ques);
}
else{
ques=int(cc[i])-int(kk[i])++;
cout<<char(ques);
}
}
else if(judge(cc[i])==true&&judge(kk[i])==false){//密文是大写,密钥是小写,还是输出大写
int kkk=int(kk[i])-;
int ccc=int(cc[i]);
if(ccc-kkk>=){
ques=ccc-kkk+;
cout<<char(ques);
}
else{
ques=ccc-kkk++;
cout<<char(ques);
}
}
else if(judge(cc[i])==false&&judge(kk[i])==true){//密文是小写,密钥是大写,输出小写
int kkk=int(kk[i])+;
int ccc=int(cc[i]);
if(ccc-kkk>=){
ques=ccc-kkk+;
cout<<char(ques);
}
else{
ques=ccc-kkk++;
cout<<char(ques);
}
}
else if(judge(cc[i])==false&&judge(kk[i])==false){//两个都是小写
if(int(cc[i])-int(kk[i])>=){
ques=int(cc[i])-int(kk[i])+;
cout<<char(ques);
}
else{
ques=int(cc[i])-int(kk[i])++;
cout<<char(ques);
}
}
}
return ;
}
最新文章
- Centos7安装完毕后无法联网的解决方法
- 爹地,我找到了!,15个极好的Linux find命令示例
- IOS第三方字体
- Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别
- tyvj1023 - 奶牛的锻炼 ——DP
- UIActionSheet 传值
- Silverlight DataGrid数据行背景颜色控制
- 深入.net平台和c#编程 学习笔记
- ural 1932 The Secret of Identifier 容斥
- 时间戳 获得当前时间 -iOS
- 纠错:基于FPGA串口发送彩色图片数据至VGA显示
- 真正的精通Java是种什么样的境界?
- 搭建dnsmasq服务器,局域网内部解析
- Java编程语言下Selenium 鼠标悬停以及右击操作
- 数据仓库 - 2.数据仓库设计思路及ETL设计思路
- urlib库的使用
- MySQL(基础技能)
- Jenkins部署net core小记
- Linux只读账号配置【转】
- js实现数组去重
热门文章
- 【NOIP2016提高A组模拟8.15】Throw
- electron打包成.exe后限制只启动一个应用
- BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
- BZOJ 2121: 字符串游戏 区间DP + 思维
- windows10 gcc编译C程序(简单编译)
- maven 私服的setting.xml配置
- 如何用CSS3画出懂你的3D魔方?
- 系统性能信息模块--psutil
- office toolkit怎么用(以激活office professional 2013为例)
- ObjectDataSource.ObjectCreating 事件