电文加密

来源:百度知道 编辑:UC知道 时间:2024/06/09 07:11:03
问题描述

对某电码文(原文)进行加密并形成密文。其加密算法如下:假定原文为C1C2C3…Cn,加密后产生的密文为S1S2S3…Sn。首先读入一个正整数Key(Key>1)作为密钥匙;形成一个具有n个结点的环,序号依次为1,2,…,n。加密时从第1个结点位置起顺时针记数,当数到Key时,将原文中的字符C1写入密文字符的第key位置中,同时从环中除去该结点;接着从环中下一个字符位置起继续记述数,当再次数到第Key个位置时(设此时结点号j),将原文中字符C2放入密文的第j个位置,并从环中除去j号结点;依此类推,直到n个原文字符全部加入密文环中,由此产生S1S2S3....Sn即为原文的密文。

若读入的整数key<-1,则表示给定的字符串上用密钥-key加密的结果,要求解密得到其原文。

输入

输入有若干行,对每一种情形占两行。一行是一个整数(整数表示加密,负数表示解密),其下一行是一个可能含多个空格的字符串,其长度小于1000个字符。

输入直到文件输入结束。

输出

对每一种情形的测试数据,在一行上先输出“Case #:”,其中“#”是测试数据集的编号(从1开始),接着在下面的输出处理结果字符串。不同数据集的结果之间空一行。

输入样例

3
THIS IS AN ENCODING SYSTEM

4
THIS IS AN ENCODING SYSTEM

-3
AOTGNHEDI YS E IMINTSNC SS

-4
SSETYD HTNGIASISCNM E ION

输出样例

Case 1:
AOTGNHEDI YS E IMINTSNC SS

Case 2:
SSETYD HTNGIASISCNM E ION

Case 3:
THIS IS AN ENCODING SYSTEM

Case 4:
THIS IS

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
char s1[1100], s2[1100];
int s[1100];
int key, len, i, j;
void cpy()
{
int k = 0;
while (k != key)
{
if (!s[++j] && j < len)
k++;
if (j >= len)
j = j - len - 1;
}
s2[j] = s1[i];
s[j] = 1;
}
void cpy2()
{
int k = 0;
while (k != -key)
{
if (!s[++j] && j < len)
k++;
if (j >= len)
j = j - len - 1;
}
s2[i] = s1[j];
s[j] = 1;
}
int main()
{
#ifdef LOCAL
freopen("judge for edu\\test\\1.in", "r", stdin);
freopen("judge for edu\\test\\1.out", "w", stdout);
#endif
int c = 0;
while (cin >> key)
{
cout << "Case " << ++c << ":" << endl;
cin.getline(s1, 1);