//根据老师的要求,用这种算法求最小公倍数。总是有错
import javax.swing.JOptionPane;
public class LCM {
/** Main methed */
public static void main(String[] args) {
// Prompt user input the two numbers
String oneString = JOptionPane.showInputDialog(null,
"Please input the first number:", "Input",
JOptionPane.INFORMATION_MESSAGE);
String twoString = JOptionPane.showInputDialog(null,
"Please input the second number:", "Input",
JOptionPane.INFORMATION_MESSAGE);
// Convert the two strings into int value
double oneDouble = Double.parseDouble(oneString);
double twoDouble = Double.parseDouble(twoString);
double twoNumbersLcm; // 定义的这个字段用来存放最后的结果,也就是两个数的最小公倍数
twoNumbersLcm = lcm(oneDouble, twoDouble);
JOptionPane.showMessageDialog(null, "The lease common multiple is "
+ twoNumbersLcm, "Answer", JOptionPane.INFORMATION_MESSAGE);
}
// 求最小公倍数
public static double lcm(double one, double two) {
double[][] ones = new double[10][2];
double[][] twos = new double[10][2];
double commonMultiple = 1;
divide(ones, one);
divide(twos, two);
commonMultiple = multiple(ones, twos);
return commonMultiple;
}
// 求因子,并将得到的因子和出现的次数存到二维数组中
public static void divide(double array[][], double dividend) {
int i = 0;
double divisor = 2.0;
do {
while (dividend % divisor == 0) {
array[i][0] = divisor;
array[i][1]++;
dividend = dividend / divisor;
}
i++;
divisor++;
} while (dividend != 1);
}
//
public static double multiple(double arrayOne[][], double arrayTwo[][]) {
int i = 0;
double power = 1;
// 去次数较大的因子相乘,得到最小公倍数
while (i<=arrayOne.length || i<=arrayTwo.length) {
if (arrayOne[i][0] == arrayTwo[i][0]) {
if (arrayOne[i][1] >= arrayTwo[i][1])
power *= Math.pow(arrayOne[i][0], arrayOne[i][1]);
else
power *= Math.pow(arrayTwo[i][0], arrayTwo[i][1]);
} else
power = Math.pow(arrayOne[i][0], arrayOne[i][1])
* Math.pow(arrayTwo[i][0], arrayTwo[i][1]);
i++;
}
if (arrayOne[i][0] != 0)
power *= Math.pow(arrayOne[i][0], arrayOne[i][1]);
else
power *= Math.pow(arrayTwo[i][0], arrayTwo[i][1]);
return power;
}
}
----------------解决方案--------------------------------------------------------
总是出现这种错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at LCM.multiple(LCM.java:67)
at LCM.lcm(LCM.java:37)
at LCM.main(LCM.java:22)
----------------解决方案--------------------------------------------------------
你这个异常是数组越界异常
while (i<=arrayOne.length || i<=arrayTwo.length) {
你这里不应该有等于的情况出现,因为数组的下标最大的就是数组的长度-1
应该改为while (i<arrayOne.length || i<arrayTwo.length) {
可是改完后,你的i在最后的时候又等于了ARRAY的长度了,这个时候应该把i再减1,这样就不会有异常了,可是结果却不正确,所以你要看看你的算法是否正确
----------------解决方案--------------------------------------------------------
谢谢。。。。算法是有错误。。。当数组中有0出现时,一乘起来结果就成了0了。。。我想是这样
----------------解决方案--------------------------------------------------------
做数组的运算尤其要注意下标越界的问题,在JAVA中还好,可以告诉你是异常,还会说哪里出异常了
如果是在C。C++中的话,就那样算过去了。那样的话出的错都莫名奇妙。不知道哪里错了,
----------------解决方案--------------------------------------------------------
谢谢版主。。。。程序已经Ok了。。。作业完成了。。。心情好啊。。。。呵呵,再写点儿注释就可以交了。。。
----------------解决方案--------------------------------------------------------