⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1009_smh.cpp

📁 ACM1000_1010竞赛的赛题,源码
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>

class coder {
public :void ini(int m,char a[]);
void reini();
void rotate();
int codein(int out);
int oneround();
int codeout(int in);
private:
int adjust;
int map[26];
int mod;
};
void coder::ini(int m, char a[])
{
mod=m;
int n;
for (int i=0; i<mod; i++) {
n=a[i]-65-i;
while (n<0) n+=mod; //until >=0;
map[i]=n;
}
adjust=0;
}
void coder::reini(){ adjust=0;}
void coder::rotate()
{
adjust++;
if (adjust==mod) adjust=0;
}
int  coder::codeout(int in) //send out code file://A=0
{
int pos, result;
pos=in-adjust;
if (pos<0) pos+=mod;
result=map[pos]+in;
if (result>=mod) result-=mod;
return (result);
}
int  coder::codein(int out)
{
for (int i=0; i<mod; i++) {
if (codeout(i)==out)
return i;
}
return 0; //must be impossible
}
int coder::oneround()
{
if (adjust==0) return 1;
return 0;
}

int getline(char line[])
{
char c;
int  i=0;
while((c=getchar())!=10){
line[i]=c;
i++;
}
line[i]='\0';
return i;
}


int main()
{
int total_time;
int mod;
char ciphertext[400];
char list[27];
char plaintext;


coder c[3];
int t=1;
	while (cin>>mod) {
	if (mod==0) break;
	if (t!=1) cout<<endl;
	for (int i=0; i<3; i++) {
	cin>>list;
	c[i].ini(mod, list);
	}
	cin>>total_time;
	cout<<"Enigma "<<t<<":"<<endl;
	for (int cases=1; cases<=total_time; cases++) {
	int len=getline(ciphertext);
	for (int pos=0; pos<len; pos++) {
	plaintext=c[0].codein(c[1].codein(c[2].codein(ciphertext[pos]-65)))+97;
	cout<<plaintext;
	c[0].rotate();
	if (c[0].oneround()) {
	c[1].rotate();
	if (c[1].oneround()) c[2].rotate();
	}
	}
	cout<<endl;
	c[0].reini();
	c[1].reini();
	c[2].reini();
	}
	t++;
		}
		return 0;
		}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -