置换密码体制加密算法
原理:
把消息一行一行的写出,然后按列读取,但把列的次序打乱,列的次序就是密钥;
密钥: 4  3  1 2  5  6  7 
明文: a  t  t  a  c  k  p
       o  s  t  p  o  n  e
       d  u  n  t  i  l  t
       w  o  a  m  x  y  z 
密文:ttnaaptmtsuoaodwcoixknlypetz首先输入一串明文,再把明文转成二维数组,经加密输出密文,我在把明文转成二维数组时就出现了问题,各位大大能不能给出完整的算法或改正我的代码的错误,谢谢import java.util.*;
public class ReplaceAlog 
{ /**
 * @param args
 */
public static void main(String[] args) 
{
// TODO Auto-generated method stub
String  plaintext ;               //明文
String  key ; //密钥 char[][] plaintextArray ={};     //明文二维数组
char[] array; //明文一维数组
int m,n;
System.out.println("请输入明文:\n");
Scanner reader= new Scanner(System.in);
plaintext = reader.next();
array =plaintext.toCharArray();
System.out.println("请输入密钥(非空非零不等数字列!):");
Scanner readerKey= new Scanner(System.in);
key = readerKey.next();
n=key.length();                 //明文数组的列数
int x = plaintext.length()%n;   //确定是否要手动随机添加明文
m = plaintext.length()/n; //明文数组的行数
if(x==0)
{

for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*m + j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
}
else
{
String append="" ;    //补缺字符串
System.out.println("当前明文数组不能组成完整的"+m+"行"+n+"列"+"数组\n");
System.out.println("请随机输入"+(n-x)+"个连续小写字母:\n");
Scanner readAppend = new Scanner(System.in);
append = readAppend.next();   //得到用户输入的空缺字符串
plaintext = plaintext.concat(append);
array =plaintext.toCharArray();
for(int i=0;i<(m+1);i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*(m+1) +j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
} }}

解决方案 »

  1.   

    看起来这部分没有什么大问题吧主要是没有为数组分配内存
    加上:plaintextArray = new char[m][n];
      

  2.   

    我还没用1.5
    不过
    Scanner 应该没有必要每次弄一个的吧
    我觉得一个就够了
      

  3.   

    但是在数组循环赋值时还是出现了问题
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at ReplaceAlog.main(ReplaceAlog.java:34)
      

  4.   

    不好意思,刚学Java,所以编程风格不怎么好,所以Scanner这个看上去太多.
      

  5.   

    malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog  2006-11-30 09:54:48  得分: 0  
     
     
       看起来这部分没有什么大问题吧主要是没有为数组分配内存
    加上:plaintextArray = new char[m][n];
      
     
    =========
    没看明白呀??
    你在if(x==0)前面加上
      

  6.   

    plaintextArray[i][j]= array[i*n + j];
      

  7.   

    加了
             plaintextArray = new char[m][n];
    if(x==0)
    {

    for(int i=0;i<m;i++)
    {
    for(int j=0;i<n;j++)
    {
    plaintextArray[i][j]= array[i*n + j];
    }
    }
    System.out.println("输出明文数组");
    for(int i=0;i<m;i++)
    {
    for(int j=0;i<n;j++)
    {
    System.out.println(plaintextArray[i][j]+ "\t");
    }
    }
    }
    但还是出现了问题
      

  8.   

    plaintextArray[i][j]= array[i*m + j];->plaintextArray[i][j]= array[i*n + j];
      

  9.   

    下边呢?你的测试数据走if 还是else呀?
      

  10.   

    晕了你第二个循环用的是i<n 
    ->
    j<n
      

  11.   

    呵呵,就这错误,发现了,真不好意思!
    谢谢
    但是怎么样打印一个二维数组plaintextArray[i][j] 呢?
      

  12.   

    for(int i=0;i<m;i++)
    {
           for(int j=0;j<n;j++)
           {
       System.out.print(plaintextArray[i][j]+ "\t");
           }
           System.out.println();
    }
      

  13.   

    UP
    -----------------------------------IT者--IT开发者的网站 
      http://www.itzhe.cn