求教~~~~~帮助看一个小程序!非常感谢!

zjhlht 2008-03-02 02:12:18
这是一个简单的加密算法,本来是一个矩阵的乘法,由于个人水平有限,所以把它简化到了非常简单,
自己给出了明文与密钥(hill,1134)
原理就是把hill变成7,8,11,11
然后与密钥相乘(矩阵的相乘),得出密文
但是还是有很多问题~~~~


public class Hill
{
private int[][] MYNumber={{int a,int b},{int c,int d}}; //此处报错' .class' expected
public char MWNumber='hill'; //此处报错unclosed character literal
public Hill()
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
int[] num;
for (int i = 0; i < MWNumber.length; i++) {
int num[i] = (int) MWNumber[i] - 97; //此处有个疑问,由于是实现矩阵就做了个2维数组,但传递的时候相当郁闷!做着做着就成这样了
}
}
public void input(int a,int b,int c,int d)
{
char A=(num[0]*a+num[1]*c)+97;
char B=(num[0]*b+num[1]*d)+97;
char C=(num[2]*a+num[3]*c)+97;
char D=(num[2]*b+num[3]*d)+97;
System.out.println(A+B+C+D);
}

public static void main(String[] args)
{
Hill h1=new Hill();
h1.input(1,1,3,4);
} //此处报错';' expected
}


请问这是怎么回事?应该怎样更好的改进?

谢谢~~~~谢谢~~~~~
...全文
178 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzr82528 2008-03-03
  • 打赏
  • 举报
回复
首先分析越界的原因:你的计算查便部是正数的相加,而计算的数字又都是正整数,计算结果大于原有的所有数是正确的,也就是说,你原来对26个字母的取值为1~26,所以行到>26结果是很正常的,这样,在你加了97之后,就已经超出了字母的泛围;
不可显示的原因:其实JAVA并不是不可以显示其它字符,在JAVA中char其实是两个字节,所以,可以用65535个字符,而不是256,并不是128,所以,目前你的算法产生的数值还没有真正超出char取职泛围,当然,如是换一下输入,想要超过这个泛围也很容易的,你需要调整你输入的那几个整即可;
如:

System.out.println((char) 188);
System.out.println((char) 189);
System.out.println((char) 36789);
System.out.println((char) 36330);

的结果是:
¼
½


解决方法:有一种办法保证得到的结果是在以你所能使用的最多的字符个数为模的泛围内。
也就是说保证证你的算式在是一个同一集合内的运算,即从一个集合运算所得到结果还要在这个集合内,离散上讲过这个问题,现在已经想不起来多少少了,应该是属于格的内容。
给出一个最简单的解决方案,对计算结果(加97之前)对26取模再加1,这样就可以保证在加97的可显示。

package cn.zzr.test;

public class Hill {
private int a, b, c, d;
private int[][] MYNumber = { { a, b }, { c, d } }; // 此处报错'
public String MWNumber = "hill";
int[] num = new int[MWNumber.length()];

public Hill() {

for (int i = 0; i < MWNumber.length(); i++) {
num[i] = MWNumber.charAt(i) - 97;
}
}

public void input(int a, int b, int c, int d) {
char A = (char) (((num[0] * a + num[1] * c)) % 26 + 97);
char B = (char) (((num[0] * b + num[1] * d)) % 26 + 97);
char C = (char) (((num[2] * a + num[3] * c)) % 26 + 97);
char D = (char) (((num[2] * b + num[3] * d)) % 26 + 97);
System.out.println("" + A + B + C + D);
}

public static void main(String[] args) {
Hill h1 = new Hill();
h1.input(1, 1, 3, 4);
}
}


这个可以正确显示楼主想要的字符串。

算法的事情楼主自己去想办法,取模不能解决所有问题,因为取模是属于不可逆运算,如是你还想从结果得到计算前的数据,那就不行了。
算法是程序的灵魂,多研究一下是很有好处的。

顺便推荐两本书,一本是麻省理工出的那本Introduction to Algorithms
一本是著名的The Art of Computer Programing
bt_lose 2008-03-02
  • 打赏
  • 举报
回复

public static void main(String[] args) {
Hill h1 = new Hill(1,1,3,4,"hill");
h1.input();
}


这样也可以调用,忘了注释...

public class Hill {
private int[][] MYNumber;//用来存储密钥

public String MWNumber = "hill";//明文

int[] num;//用来存储明文拆成单个字符

public Hill(int a, int b, int c, int d, String str) {
MYNumber = new int[][] { { a, b }, { c, d } };
this.MWNumber = str;
num = new int[MWNumber.length()];
//初始化num
for (int i = 0; i < MWNumber.length(); i++) {
num[i] = (int) MWNumber.charAt(i) - 97;
}
}

public Hill() {
this(1,1,3,4,"hill");
}
//加密过程
public void input() {
char A = (char) ((num[0] * MYNumber[0][0] + num[1] * MYNumber[1][0]) + 97);
char B = (char) ((num[0] * MYNumber[0][1] + num[1] * MYNumber[1][1]) + 97);
char C = (char) ((num[2] * MYNumber[0][0] + num[3] * MYNumber[1][0]) + 97);
char D = (char) ((num[2] * MYNumber[0][1] + num[3] * MYNumber[1][1]) + 97);
//计算结果中可能有不可见字符,故转换成整行
System.out.println((int) A);
System.out.println((int) B);
System.out.println((int) C);
System.out.println((int) D);
}

public static void main(String[] args) {
Hill h1 = new Hill(1,1,3,4,"hill");
h1.input();
}
}


bt_lose 2008-03-02
  • 打赏
  • 举报
回复
楼主可能是把看到的算法按照某种语言的语法写下来了..所以才会出那么多错
int[][] MYNumber 二维数组也没用上,成员变量private int a, b, c, d; 在程序中也没有实际意义
密钥是通过input方法的参数传过去的,经过1楼改后没有语法错误了,但还是没有处理上述问题.

public class Hill {
private int[][] MYNumber;

public String MWNumber = "hill";

int[] num;

public Hill(int a, int b, int c, int d, String str) {
MYNumber = new int[][] { { a, b }, { c, d } };
this.MWNumber = str;
num = new int[MWNumber.length()];
for (int i = 0; i < MWNumber.length(); i++) {
num[i] = (int) MWNumber.charAt(i) - 97;
}
}

public Hill() {
this(1,1,3,4,"hill");
}

public void input() {
char A = (char) ((num[0] * MYNumber[0][0] + num[1] * MYNumber[1][0]) + 97);
char B = (char) ((num[0] * MYNumber[0][1] + num[1] * MYNumber[1][1]) + 97);
char C = (char) ((num[2] * MYNumber[0][0] + num[3] * MYNumber[1][0]) + 97);
char D = (char) ((num[2] * MYNumber[0][1] + num[3] * MYNumber[1][1]) + 97);
System.out.println((int) A);
System.out.println((int) B);
System.out.println((int) C);
System.out.println((int) D);
}

public static void main(String[] args) {
Hill h1 = new Hill();
h1.input();
}
}
zjhlht 2008-03-02
  • 打赏
  • 举报
回复
非常感谢~~~~

受教了~~~~

但是问题还是没解决!!!!
zjhlht 2008-03-02
  • 打赏
  • 举报
回复
在求教一个~~~~

char A = (char) ((num[0] * MYNumber[0][0] + num[1] * MYNumber[1][0]) + 97);
System.out.println((int) A);

因为产生的密文必须是字母形式的,但上面int值要大于char最大的127,强制转换后得到的是“??”
请问怎么办??

谢谢~~谢谢~~
zzr82528 2008-03-02
  • 打赏
  • 举报
回复
很遗憾的告诉楼主,你的代码错误太多了,而都是基础语法问题。
根据楼主原意,我改了代码的语法错误,结构和算法的问题没有处理。楼主自己再去考虑。
我改了输出部分,因为得到的部分都是不可显示字符,所以,呵呵。
自已看吧。

package cn.zzr.test;

public class Hill {
private int a, b, c, d;
private int[][] MYNumber = { { a, b }, { c, d } }; // 此处报错'
public String MWNumber = "hill";
int[] num = new int[MWNumber.length()];

public Hill() {

for (int i = 0; i < MWNumber.length(); i++) {
num[i] = MWNumber.charAt(i) - 97;
}
}

public void input(int a, int b, int c, int d) {
char A = (char) ((num[0] * a + num[1] * c) + 97);
char B = (char) ((num[0] * b + num[1] * d) + 97);
char C = (char) ((num[2] * a + num[3] * c) + 97);
char D = (char) ((num[2] * b + num[3] * d) + 97);
System.out.println((int)A);
System.out.println((int)B);
System.out.println((int)C);
System.out.println((int)D);
}

public static void main(String[] args) {
Hill h1 = new Hill();
h1.input(1, 1, 3, 4);
}
}
Willianleon0926 2008-03-02
  • 打赏
  • 举报
回复
加油,一切都慢慢来.!^_^
zjhlht 2008-03-02
  • 打赏
  • 举报
回复
本来直接是问hill体制的算法的~~~~

但是没人教我~~~结果导致成乱七八糟的!

接收5楼教诲~~~~

谢谢帮助~~~~正在继续研究!
chaorenwopashei 2008-03-02
  • 打赏
  • 举报
回复
越改越复杂么 难的很么
yuzhi130 2008-03-02
  • 打赏
  • 举报
回复
这家伙写的什么啊!一大堆的报错!自己多改改吗!

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧