java编程找出吸血鬼数字,Java 找到四位数的所有吸血鬼数字 基础代码实例

Java 找出四位数的所有吸血鬼数字 基础代码实例

/**

* 找出四位数的所有吸血鬼数字

* 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.

* 以两个0结尾的数字是不允许的。

*   例如下列数字都是吸血鬼数字

1260=21*60

1827=21*87

2187=27*81

...

* 比较笨的低效率的做法: 遍历所有四位数, 每生成一个四位数的时候,

*         在双重循环遍历两位数,在两位数的内层循环中判断是否与最外层循环的四位数相等。 如果相等把这些数字都存放到数组,进行排序后比较

*         两组数字,如果相等那么输出这个数就是要找的数字;

*/

了解下这个英文参考:吸血鬼数字

An important theoretical result found by Pete Hartley:

If x·y is a vampire number thenx·y == x+y (mod 9)

Proof:

Letmodbe the binary modulo operator andd(x)the

sum of the decimal digits of x.

It is well-known that d(x) mod 9 = x mod 9, for all x.

Assume x·y is a vampire. Then it contains the same digits as x and y, and in particular d(x·y) = d(x)+d(y). This leads to:

(x·y) mod 9 = d(x·y) mod 9 = (d(x)+d(y)) mod 9 = (d(x) mod 9 + d(y) mod

9) mod 9

= (x mod 9 + y mod 9) mod 9 = (x+y) mod 9

The solutions to the congruence are(x mod 9, y mod 9)in{(0,0),

(2,2), (3,6), (5,8), (6,3), (8,5)}

Only these cases (6 out of 81) have to be tested in a vampire search based on testing x·y for different values of x and y.

下面五中方法, 其中还是ThinkinJava给出的参考答案效率最高, 其他高效率做法 , 请网友高手大神补充

import java.util.Arrays;

public class Demo3 {

static int a; //千位

static int b; //百位

static int c; //十位

static int d; //个位

static int a1; //十位

static int b1; //个位

static int c1; //十位

static int d1; //个位

static int sum = 0; //总和

static int sum2 = 0; //两数之积

public static void main(String[] args) {

long startTime = System.nanoTime();

method1();

long endTime = System.nanoTime();

System.out.println("method1 :" + (endTime - startTime)); //method1 :185671841

long s = System.nanoTime();

method2();

long d = System.nanoTime();

System.out.println("method2 :" + (d - s)); //method2 :90556063

long s3 = System.nanoTime();

method3();

long d3 = System.nanoTime();

System.out.println("method3 :" + (d3 - s3));//method3 :574735

long s4 = System.nanoTime();

method4();

long d4 = System.nanoTime();

System.out.println("method4 :" + (d4 - s4));//method4 :22733469

long s5 = System.nanoTime();

method5();

long d5 = System.nanoTime();

System.out.println("method5 :" + (d5 - s5));//method4 :19871660

}

private static void method5() {

new VampireNumbers(); //该方法 有重复数字

}

static class VampireNumbers {

static int a(int i) {

return i / 1000;

}

static int b(int i) {

return (i % 1000) / 100;

}

static int c(int i) {

return ((i % 1000) % 100) / 10;

}

static int d(int i) {

return ((i % 1000) % 100) % 10;

}

static int com(int i, int j) {

return (i * 10) + j;

}

static void productTest(int i, int m, int n) {

if (m * n == i)

System.out.println(i + " = " + m + " * " + n);

}

public VampireNumbers() {

for (int i = 1001; i < 9999; i++) {

productTest(i, com(a(i), b(i)), com(c(i), d(i)));

productTest(i, com(a(i), b(i)), com(d(i), c(i)));

productTest(i, com(a(i), c(i)), com(b(i), d(i)));

productTest(i, com(a(i), c(i)), com(d(i), b(i)));

productTest(i, com(a(i), d(i)), com(b(i), c(i)));

productTest(i, com(a(i), d(i)), com(c(i), b(i)));

productTest(i, com(b(i), a(i)), com(c(i), d(i)));

productTest(i, com(b(i), a(i)), com(d(i), c(i)));

productTest(i, com(b(i), c(i)), com(d(i), a(i)));

productTest(i, com(b(i), d(i)), com(c(i), a(i)));

productTest(i, com(c(i), a(i)), com(d(i), b(i)));

productTest(i, com(c(i), b(i)), com(d(i), a(i)));

}

}

}

private static void method4() { // 改进

for (int i = 11; i < 100; i++) {

for (int j = i; j < 100; j++) {

int k = i * j;

String kStr = Integer.toString(k);

String checkStr = Integer.toString(i) + Integer.toString(j);

if (kStr.length() != 4)

continue;

char[] kChar = kStr.toCharArray();

char[] checkChar = checkStr.toCharArray();

Arrays.sort(kChar);

Arrays.sort(checkChar);

boolean isVampire = Arrays.equals(kChar, checkChar);

if (isVampire) {

System.out.println(i + " * " + j + " = " + k);

}

}

}

}

private static void method3() { // 官方参考答案

int[] startDigit = new int[4];

int[] productDigit = new int[4];

for (int num1 = 10; num1 <= 99; num1++)

for (int num2 = num1; num2 <= 99; num2++) {

// Pete Hartley's theoretical result:

// If x·y is a vampire number then

// x·y == x+y (mod 9)

if ((num1 * num2) % 9 != (num1 + num2) % 9)

continue;

int product = num1 * num2;

startDigit[0] = num1 / 10;

startDigit[1] = num1 % 10;

startDigit[2] = num2 / 10;

startDigit[3] = num2 % 10;

productDigit[0] = product / 1000;

productDigit[1] = (product % 1000) / 100;

productDigit[2] = product % 1000 % 100 / 10;

productDigit[3] = product % 1000 % 100 % 10;

int count = 0;

for (int x = 0; x < 4; x++)

for (int y = 0; y < 4; y++) {

if (productDigit[x] == startDigit[y]) {

count++;

productDigit[x] = -1;

startDigit[y] = -2;

if (count == 4)

System.out.println(num1 + " * " + num2 + " : "

+ product);

}

}

} /*

* Output: 15 * 93 : 1395 21 * 60 : 1260 21 * 87 : 1827 27 * 81 :

* 2187 30 * 51 : 1530 35 * 41 : 1435 80 * 86 : 6880

*///:~

}

private static void method2() { // 穷举2

//遍历四位数,排除00 从1001开始

for (int i = 1001; i <= 9999; i++) {

//排除00

if (i % 100 != 00) {

for (int k = 0; k < 100; k += 10) {

if (k != 0) {

//10 -99

for (int j2 = 0; j2 <= 9; j2++) {

//生成第一个两位数

for (int j = 0; j < 100; j += 10) {

for (int j3 = 0; j3 <= 9; j3++) {

//生成第二个两位数

//判断两数之积

if ((k + j2) * (j + j3) == i) {

if (compare2(i, k / 10, j2, j / 10, j3)) {

System.out

.println(i + "=" + (k + j2)

+ "*" + (j + j3));

}

}

}

}

}

}

}

}

}

}

public static void method1() { //穷举1

int x = 0, y = 0;

for (int i = 1; i <= 9; i++) {

a = i * 1000;

for (int j = 0; j <= 9; j++) {

b = j * 100;

for (int j2 = 0; j2 < 10; j2++) {

c = j2 * 10;

for (int k = 0; k < 10; k++) {

d = k;

sum = a + b + c + d;

//取其中四个数字 中组成两个两位数 ,如果这两个两位数之积 等于 sum ,则输入 这个数

for (int k2 = 1; k2 < 10; k2++) {

a1 = k2 * 10;

for (int l = 0; l < 10; l++) {

if (a1 + b1 > 100) {

break;

}

b1 = l;

//得到一个两位数字

for (int l2 = 1; l2 < 10; l2++) {

c1 = l2 * 10;

for (int m = l; m < 10; m++) {

if (c1 + d1 > 100) {

break;

}

d1 = m;

//再得到一个两位数字

sum2 = (a1 + b1) * (c1 + d1);

//计算来两个两位数字之积,如果等于sum

if (sum2 == sum) {

//且尾数不能为00

if (c + d != 0) {

// 比较这个几个数字 是否一样

if (compare(a, b, c, d, a1, b1,

c1, d1)) {

System.out.println(sum

+ "=" + (a1 + b1)

+ "*" + (c1 + d1));

}

}

}

}

}

}

}

}

}

}

}

}

private static boolean compare2(int i, int j, int j2, int k, int j3) {

int a[] = { i % 10, i / 10 % 10, i / 100 % 10, i / 1000 };

int b[] = { j, j2, k, j3 };

Arrays.sort(a);

Arrays.sort(b);

if (Arrays.equals(a, b))

return true;

else

return false;

}

private static boolean compare(int a2, int b2, int c2, int d2, int a12,

int b12, int c12, int d12) {

int[] a = new int[4];

int[] b = new int[4];

a[0] = a2 / 1000;

a[1] = b2 / 100;

a[2] = c2 / 10;

a[3] = d2;

b[0] = a12 / 10;

b[1] = b12;

b[2] = c12 / 10;

b[3] = d12;

Arrays.sort(a);

Arrays.sort(b);

if (Arrays.equals(a, b))

return true;

else

return false;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Java程序,可以找出所有4位数的吸血鬼数字: ```java public class VampireNumbers { public static void main(String[] args) { for (int i = 1000; i < 10000; i++) { int a = i / 1000; int b = (i / 100) % 10; int c = (i / 10) % 10; int d = i % 10; if (checkVampireNumber(a, b, c, d, a, b, c, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, b, d, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, c, b, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, c, d, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, d, b, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, d, c, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, a, c, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, a, d, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, c, a, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, c, d, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, d, a, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, d, c, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, a, b, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, a, d, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, b, a, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, b, d, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, d, a, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, d, b, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, a, b, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, a, c, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, b, a, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, b, c, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, c, a, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, c, b, a)) { System.out.println(i); } } } public static boolean checkVampireNumber(int a, int b, int c, int d, int w, int x, int y, int z) { int num1 = 10 * a + b; int num2 = 10 * c + d; int product = num1 * num2; int firstHalf = 10 * w + x; int secondHalf = 10 * y + z; return product == firstHalf * secondHalf && product % 100 != 0; } } ``` 该程序通过枚举所有可能的数字组合,并检查它们是否满足吸血鬼数字的定义来找出所有4位数的吸血鬼数字

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值