/**
 * 找出四位数的所有吸血鬼数字
 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.
 * 以两个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 then x·y == x+y (mod 9)
Proof:
Let mod be the binary modulo operator and d(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 :185671841long s = System.nanoTime();method2();long d = System.nanoTime();System.out.println("method2 :" + (d - s)); //method2 :90556063long s3 = System.nanoTime();method3();long d3 = System.nanoTime();System.out.println("method3 :" + (d3 - s3));//method3 :574735long s4 = System.nanoTime();method4();long d4 = System.nanoTime();System.out.println("method4 :" + (d4 - s4));//method4 :22733469long 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 -99for (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() { //穷举1int 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;elsereturn 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;elsereturn false;}
}
}

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

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

    Java 找出四位数的所有吸血鬼数字 基础代码实例 /** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最 ...

  2. java 4位数,java 找出4位数的所有吸血鬼数字

    java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...

  3. 怎样轻松找出4位数的所有“吸血鬼”数字,多种高效算法详解

    关于吸血鬼数字算法问题,我也是读<java编程思想>中遇到的,觉得很有意思.于是,就去做了做.但因为我的粗心,读题的时候忽略了点问题,所以导致我的思路出现了岔口!(当时的思路就是想着把一个 ...

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

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

  5. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?

    找出1到4000中,数字的各位数之和能被4整除的数,如:745:7+4+5=16,16可以被4整除:28:2+8=10,10不能被4整除:745就是这样的特殊数字,而28不是,求:这样的数字共有多少个 ...

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

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

  7. 找出数组中任一重复的数字

    找出数组中任一重复的数字 找出数组中任一重复的数字   在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重 ...

  8. python输入一个四位整数、判断该数是否是四叶玫瑰数_四叶玫瑰数是指四位数各位上的数字的四次方之和等于本身的数,请同学们用PYTHON编程实现查找(1000-10000)之间的四叶玫瑰数...

    [简答题]1.2.3.4.5.6.7.11 [简答题]素描线条 [单选题]下列有关局部变量的说法正确的是( ) [其它]上传面部刮痧的操作视频,以及小组的评分表 [单选题]有关全局变量说法不正确的是( ...

  9. python 计算数字位数_Python 统计位数为偶数的数字的代码

    问题描述 给出一个整数数组 nums,请返回其中位数为偶数的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 34 ...

最新文章

  1. php的闭包函数use的使用
  2. 国产海翼号水下滑翔机首次应用于北极科考
  3. Linux系统之创建逻辑卷
  4. vba 跳出for循环_VBA简单入门08:For循环
  5. java return this
  6. 卸载KVM虚拟机(全、干净、彻底)
  7. opengl学习笔记 (一)
  8. 自动出报表,零代码做驾驶舱,我找到了Excel的顶级替代
  9. java excel类库_Java 操作 Excel 的类库 jExcelApi
  10. 对于计算机专业的调查报告,计算机专业调查报告.doc
  11. Weblogic常见故障常:JDBC Connection Pools
  12. 推荐系统(3)——个性化推荐系统架构
  13. 如何查找Steam好友代码(以及添加好友代码)
  14. 网站联系表单,honeypot蜜罐理论及操作技术,诱饵机器人
  15. 【python 新浪微博爬虫】python 爬取新浪微博热门话题
  16. 7.面向对象进阶(1)
  17. mysql-8.0.19-winx64安装过程
  18. 对抗生成网络代码Generative Adversarial Networks (GANs),Vanilla GAN,Deeply Convolutional GANs
  19. 微型计算机循环结构程序,微机原理(循环程序设计)..doc
  20. Codeforces 892A. Greed

热门文章

  1. ansys怎么批量输入点坐标_Ansys APDL 读取所有节点坐标及其应变值并写入文件
  2. HashMap、HashTable和ConcurrentHashMap的区别
  3. 每日一支TED——弗兰斯·兰庭:为动物发声的摄影作品——2015年6月3日
  4. VMware虚拟机快照功能
  5. forEach()、Object.keys()的介绍
  6. LED调光闪烁的原因
  7. [转] 魔兽系列事件报道
  8. iOS- Exception Type: 00000020:什么是看门狗机制(转)
  9. 微信3.1.0.58逆向-微信3.1.0.58HOOK接口(WeChatHelper3.1.0.58.dll)使用说明-获取群成员
  10. 24届南京邮电大学自动化考研最新三年院校分析!