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;

}

}

}

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

  1. java编程找出吸血鬼数字,找出四位數的所有吸血鬼數字(JAVA)

    /** * 找出四位數的所有吸血鬼數字 * 吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序. * 以兩個0結尾 ...

  2. java怎么找出数组最小值,Java找出数组的最小值元素

    Java找出数组的最小值元素 1 说明 在此程序中,我们需要找出数组中存在的最小元素.这可以通过保持变量min来实现,该变量起初将保留第一个元素的值.通过将min的值与数组的元素进行比较来遍历数组.如 ...

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

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

  4. 找出数组中只出现了一次的数字(Java)

    找出数组中只出现了一次的数字 题目 题目分析 方法1 方法2 方法3 代码实现 主方法 方法1 第一种:使用计数器的 第二种:不使用计数器 方法2 方法3 总结 题目 给定一个非空整数数组,除了某个元 ...

  5. java 找出所有水仙花数,java兑现找出所有的水仙花数

    java实现找出所有的水仙花数. 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 在没有考虑效率的情况下 ...

  6. Java:找出100以内的质数(一)。

    Java:找出1~100之间的质数. 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 由以上的定义我们可以延伸出另一种解释:这个数 ...

  7. JAVA2块钱瓶子_啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶。用java编程解出答案,求大神们帮忙...

    点击查看啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶.用java编程解出答案,求大神们帮忙具体信息 答:package test;public class Test {publ ...

  8. 题目1256:找出两个只出现了一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的第一行包括一个整数N(1<=N<=1000). 接下来的一行包括N个 ...

  9. 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    package demo;import java.util.Arrays;/** 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.*/ //num ...

最新文章

  1. mysql使用索引为什么查询速度变快很多?
  2. ZkServer服务启动的逻辑-ServerCnxnFactory.createFactory
  3. 项目管理基础:系统分析相关概念介绍
  4. Java|达梦工作笔记-达梦数据库同步工具(JDBC)
  5. listview添加列
  6. 2015二级java真题及答案_2015计算机二级《JAVA》考前模拟操作和应用题及答案
  7. 647. 回文子串(JavaScript)
  8. 产品设计体会(6010)有关网站改版
  9. 开发必学的验证码,教你从零写一个验证码
  10. excel英文大小写转换
  11. 基于JavaEE的酒店客房管理系统
  12. 软件测试面试之逻辑篇(一)
  13. Android studio 如何连接手机
  14. 135编辑器怎么用HTML,微信公众号文章查看HTML代码(HTML代码修改方法)
  15. ARD智能电动机控制器在苯乙烯生产过程中的应用
  16. 谷歌 火狐 主页被篡改,修改文件名解决
  17. POE光纤收发器的三大应用场景
  18. Asterisk模块编写指南
  19. 数据预处理之数据清洗
  20. 光电设计竞赛国赛经历及感悟

热门文章

  1. 深度学习模型试跑(十一):PaddleOCR(c++,vs2019)
  2. RabbitMq Direct exchange路由模型
  3. DateCalander
  4. 简述windows计算机启动过程,计算机启动过程
  5. JAVA数字大写金额转换
  6. Lancet子刊:预测婴儿自闭症:进展与挑战
  7. 网速监测-window小应用
  8. mySql 脏读,幻读,不可重复度与事务隔离级别
  9. 数字化转型时代,我们为什么越来越需要数据库云管平台?
  10. 王者归来,低代码的逆袭之路