题目:在战争时期,各个国家都要保证军队的行动保密性,所以在信息传达时会采取各种加密方法。有一天,A国安全局成员Oo(也就是传说中的ZSL),发明了一种对指令的加密方法。具体操作如下,取两个正整数X、Y,对于一段明文字符串,将其按行填入一个X行Y列的矩阵中(非字母不填、而且全部字母要求权转换为大写),若未填满,则按字母表顺序顺次填充(’A’…’Z’循环填充)。例如对于X=3,Y=3,明文为”Problem”时,矩阵填充后的结果为:
PRO
BLE
MAB
这样,Oo就得到了一个矩阵,将他按列输出就得到了Oo所要的的密文“PBMRLAOEB”。由于A国编程人员奇缺。所以Oo向你求帮助,希望你能够帮助他写一个加密程序,从而使得对于任意给定的X、Y以及明文,程序都能输出正确的密文。
Input
第一行X,Y(0 < X <= 200,0 < Y <= 200)。
第二行至末尾每行均为一个明文(保证明文中字母的个数N <= X*Y)。
Output
对于每一行明文输出对应的一行密文。
Sample Input
3 3
Problem
t e s t
l I 156-*/- S t
u 45/-90 N I v \908() 8768 *er #!@$& S a L
Sample Output
PBMRLAOEB
TTCEADSBE
LTCIADSBE
UVSNEAIRL
各位大神看看本人的算法的额。
PRO
BLE
MAB
这样,Oo就得到了一个矩阵,将他按列输出就得到了Oo所要的的密文“PBMRLAOEB”。由于A国编程人员奇缺。所以Oo向你求帮助,希望你能够帮助他写一个加密程序,从而使得对于任意给定的X、Y以及明文,程序都能输出正确的密文。
Input
第一行X,Y(0 < X <= 200,0 < Y <= 200)。
第二行至末尾每行均为一个明文(保证明文中字母的个数N <= X*Y)。
Output
对于每一行明文输出对应的一行密文。
Sample Input
3 3
Problem
t e s t
l I 156-*/- S t
u 45/-90 N I v \908() 8768 *er #!@$& S a L
Sample Output
PBMRLAOEB
TTCEADSBE
LTCIADSBE
UVSNEAIRL
各位大神看看本人的算法的额。
// 文件加密.cpp : Defines the entry point for the console application. // #include"stdio.h" #include "string.h" int main(int argc, char* argv[]) { int k,x,y,i,sum=0,zimu=65; char str[2000]; char str2[2000]; scanf("%d %d",&x,&y); getchar(); sum=x*y; while (gets(str)) { zimu=65; for(k=0,i=0;str[i]!="\0";i++) { if(str[i]>="A"&&str[i]<="z") { if(str[i]>="a") { str[i]=str[i]-("a"-"A"); } str2[k]=str[i]; k++; } } str2[k]="\0"; for(i=strlen(str2);i<=sum;i++,zimu++) { if(zimu>"Z") { zimu=65; } str2[i]=zimu; } str2[i]="\0"; //shuchu for(i=0;i!=sum-1;i=i+y) { if(i>sum-1) { i=i-sum+1; } printf("%c",str2[i]); } printf("%c\n",str2[i]); } return 0; }
解决方案
30
三个回复不能再回复,CSDN太土。本人一早就发现问题了,但发不了言,是下面这行的问题:
[code=c]
while(gets(a))
{
i=j=0;
while((ch=a[i++])!=0)
{
if(ch>=”a” && ch<=”z”)
ch+=”A”-“a”;
if(ch>=”A” && ch<=”Z”)
a[j++]=ch;
}
for(i=0;i<r*c;++i)
{
k=i%r*c+i/r;
o[i]=k<j?a[k]:”A”+(k-j)%26;
}
// 原来的程序错在这里
o[i]=”\0″;// j应该改成i, j是输入串长度的别名,i在这里是r*c, 即矩阵元素个数。
printf(“%s\n”,o);
}
return 0;
[code]
本人试了,一次通过。
[code=c]
while(gets(a))
{
i=j=0;
while((ch=a[i++])!=0)
{
if(ch>=”a” && ch<=”z”)
ch+=”A”-“a”;
if(ch>=”A” && ch<=”Z”)
a[j++]=ch;
}
for(i=0;i<r*c;++i)
{
k=i%r*c+i/r;
o[i]=k<j?a[k]:”A”+(k-j)%26;
}
// 原来的程序错在这里
o[i]=”\0″;// j应该改成i, j是输入串长度的别名,i在这里是r*c, 即矩阵元素个数。
printf(“%s\n”,o);
}
return 0;
[code]
本人试了,一次通过。