比赛 NOIP2015普及组练习 评测结果 AAAAAAAAAA
题目名称 Vigenère密码 最终得分 100
用户昵称 lxtgogogo 运行时间 0.015 s
代码语言 C++ 内存使用 0.33 MiB
提交时间 2015-11-03 21:42:37
显示代码纯文本
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;

string str;
string key;
int n=0,m=0,nk[100]={};

struct hehe
{
	int zifu;
	bool big;
};
hehe mi[1000],ming[1000];

void exchange()
{
	for(int i=0;i<1000;i++)     //默认都不是大写
	{
		mi[i].big=false;
		ming[i].big=false;
	}
	n=str.size();           //将密文换成全相应数字并记录大写的位置
	for(int i=0;i<n;i++)
	{
		if(int(str[i])>96)
			mi[i].zifu=int(str[i])-96;
		else
		{
			mi[i].zifu=int(str[i])-64;
			mi[i].big=true;
		}
	}
	m=key.size();
	for(int i=0;i<m;i++)//密匙全转相应数字
	{
		if(int(key[i])>96)
			nk[i]=int(key[i])-96;
		else	nk[i]=int(key[i])-64;
	}
}

void work()
{
	int k=0;
	for(int i=0;i<n;i++)
	{
		if((mi[i].zifu+1-nk[k])<=0)    //转换
			ming[i].zifu=mi[i].zifu+1-nk[k]+26;
		else	ming[i].zifu=mi[i].zifu+1-nk[k];
		k++;
		if(k+1>m)	k=0;
	}
}

void print()
{
	for(int i=0;i<n;i++)
	{
		if(mi[i].big==true)
			cout<<char(ming[i].zifu+64);
		else	cout<<char(ming[i].zifu+96);
	}
}

int main()
{
	freopen("vigenere.in","r",stdin);
	freopen("vigenere.out","w",stdout);
	
	cin>>key>>str;
	exchange();
	work();
	print();
	cout<<endl;
	
	fclose(stdin);fclose(stdout);
	return 0;
}