您的位置:首页 > 编程语言 > Java开发

java输出吸血鬼数字小结

2014-11-05 15:53 441 查看

        实习了四个月,感觉失去了很多也得到了很多,现在又重新开始记录自己的点滴。

        昨天在看《java编程思想》的时候,看到一道练习题觉得挺有意思就试着编了一下,好久不编程序都生疏了。下面就先看看我最开始编的程序,这是我看到题目时的第一反应,后面看了别人写的一些代码觉得非常不错就摘录了过来。

package controler4;
/**
* 问题描述:
*        吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字
*   各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
* 例如:
*      1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81
* 要求输出所有四位数的吸血鬼数字。
*/

public class Ex10_3 {
public static void main(String[] args) {
//num数组存储四位数字
int num[] = new int[4], j = 0, k = 1;
//fir,sec数组分别存储第1个,第2个两位数
int fir[] = new int[12], sec[] = new int[12];
//统计程序执行时间
long start = System.currentTimeMillis();
for (int i = 1001; i < 9999; i++) {
for(char c : (Integer.toString(i)).toCharArray())
num[j++] = (int)c - 48;
j = 0;
if (num[2] == 0 && num[3] == 0)
continue;

//分12种情况(a b c d)?
//ab * cd, ab * dc, ba * cd, ba * dc
//ac * bd, ac * db, ca * bd, ca * db
//ad * bc, ad * cb, da * bc, da * cb
fir[0] = num[0] * 10 + num[1];
sec[0] = num[2] * 10 + num[3];
fir[1] = num[0] * 10 + num[1];
sec[1] = num[3] * 10 + num[2];
fir[2] = num[1] * 10 + num[0];
sec[2] = num[2] * 10 + num[3];
fir[3] = num[1] * 10 + num[0];
sec[3] = num[3] * 10 + num[2];
fir[4] = num[0] * 10 + num[2];
sec[4] = num[1] * 10 + num[3];
fir[5] = num[0] * 10 + num[2];
sec[5] = num[3] * 10 + num[1];
fir[6] = num[2] * 10 + num[0];
sec[6] = num[1] * 10 + num[3];
fir[7] = num[2] * 10 + num[0];
sec[7] = num[3] * 10 + num[1];
fir[8] = num[0] * 10 + num[3];
sec[8] = num[1] * 10 + num[2];
fir[9] = num[0] * 10 + num[3];
sec[9] = num[2] * 10 + num[1];
fir[10] = num[3] * 10 + num[0];
sec[10] = num[1] * 10 + num[2];
fir[11] = num[3] * 10 + num[0];
sec[11] = num[2] * 10 + num[1];
for (int m = 0; m < 12; m++) {
if (fir[m] * sec[m] == i) {
System.out.println("第" + k + "组:" + fir[m] + " * " + sec[m] + " = " + i);
k++;
}
}
}
long end = System.currentTimeMillis();
System.out.println("程序总共执行了" + (end - start) + "ms");
}
}

程序运行结果如下:



        这里的结果还有个重复的,就是因为四位数中有两个8造成的。尝试着通过判断四位数中重复数字的个数来把情况分类,后面越想越复杂。后面想到了再补上修改代码。

        下面引用一个别人写的代码,这里稍微修改了一下:

(引用地址http://www.oschina.net/code/snippet_190769_14639

package controler4;
import java.util.Arrays;

public class Ex10_4 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int k = 1;
for(int i = 1; i < 100; i++){
for(int j = i + 1; j < 100; j++){
//比较两个二位数合在一起与它们相乘后的结果是否相等
if(i * j > 1000){
String a = i + "" + j;
String b = i * j + "";
if(equal(a, b)) {
System.out.println("第" + k + "组:" + i + " * " + j + " = " + (i * j));
k++;
}
}
}
}
long end = System.currentTimeMillis();
System.out.println("程序共执行了" + (end - start) + "ms.");
}

//判断两个字符串包含的数字是否一致
private static boolean equal(String a, String b) {
//先排序
char[] as = a.toCharArray();
char[] bs = b.toCharArray();
Arrays.sort(as); //排序
Arrays.sort(bs); //排序
if(Arrays.equals(as, bs))
return true;
return false;
}
}

程序运行结果如下:


        

        觉得这个方法不错,很新颖,所以摘录过来让大家参考。当然还有很多好的代码,欢迎大家一起探讨学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  吸血鬼数字 Java