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