一遍就AC了,時間來不及了,就做一道吧
Problem Description
Problem Description
列變位法是古典密碼算法中變位加密的一種方法,具體過程如下將明文字符分割成個數固定的分組(如5個一組,5即爲密鑰),按一組一行的次序整齊排列,最後不足一組不放置任何字符,完成後按列讀取即成密文。
比如:
原文:123456789
密鑰:4
變換後的矩陣:
1234 5678 9xxx
(最後的幾個x表示無任何字符,不是空格,不是製表符,就沒有任何字符,下同)
密文:159263748
再比如:
原文:Hello, welcome to my dream world!
密鑰:7
變換後的矩陣:
Hello, welcome to my dream w orld!xx
密文:
Hw doeetrrlloellc adoomm!,my e w
實現一個利用列變位法的加密器對Bob來說輕而易舉,可是,對Bob來說,想清楚如何寫一個相應的解密器似乎有點困難,你能幫幫他嗎?
Input
第一行一個整數T,表示T組數據。
每組數據包含2行
第一行,一個字符串s(1≤|s|≤1e5),表示經過列變位法加密後的密文
第二行,一個整數K(1≤K≤|s|),表示原文在使用列變位法加密時的密鑰
輸入保證密文字符串中只含有ASCII碼在[0x20,0x7F)範圍內的字符
Output
對於每組數據,先輸出一行
Case #i:
然後輸出一行,包含一個字符串s_decrypt,表示解密後得到的明文
Sample Input
4 159263748 4 Hw doeetrrlloellc adoomm!,my e w 7 Toodming is best 16 sokaisan 1
Sample Output
Case #1: 123456789 Case #2: Hello, welcome to my dream world! Case #3: Toodming is best Case #4: sokaisan
#include<stdio.h>
#include<string.h>
char a[100002]={0},b[100001]={0};
int main()
{
int n,i,sum,lenth,hang,lie,yu,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
sum=0;
getchar();
gets(a);
lenth=strlen(a);
scanf("%d",&lie);
hang=lenth/lie;
yu=lenth%lie;
for(k=0;k<lie;k++)
{
if(k<yu)
{
for(j=0;j<=hang;j++)
{
b[k+j*lie]=a[sum];
sum++;
}
}
else
{
for(j=0;j<hang;j++)
{
b[k+j*lie]=a[sum];
sum++;
}
}
}
printf("Case #%d:\n",i+1);
puts(b);
for(j=0;j<lenth;j++)
{
a[j]=b[j]=0;
}
}
return 0;
}