packagetest4;importjava.util.Arrays;/*** 从TIJ中第4章的练习10看到“吸血鬼数字”,以下几种方法实现以及执行时间对比

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

* 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,

* 其中从最初的数字中选取的数字可以任意排序.

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

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

* 1260=21*60

* 1827=21*87

* 2187=27*81*/

public classTest1 {public static voidmain(String[] args) {long start =System.nanoTime();

fun1();long end =System.nanoTime();

System.out.println("方法1所用时间:" + (end - start)+"\n");

start=System.nanoTime();

fun2();

end=System.nanoTime();

System.out.println("方法2所用时间:" + (end - start)+"\n");

start=System.nanoTime();

fun3();

end=System.nanoTime();

System.out.println("方法3所用时间:" + (end - start)+"\n");

start=System.nanoTime();

fun4();

end=System.nanoTime();

System.out.println("方法4所用时间:" + (end - start)+"\n");

}private static voidfun1() {//参考答案

int sum = 0;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("第" + sum + "组: " + num1 + " * " + num2 + " : " +product);

sum++;

}

}

}

}

System.out.println("方法1共找到" + sum + "组吸血鬼数");

}private static voidfun2() {

String[] ar_str1, ar_str2;int sum = 0;intfrom;intto;inti_val;for (int i = 10; i < 100; i++) {

from= Math.max(1000 / i, i + 1);

to= Math.min(10000 / i, 100);//2个数的乘积是4位数(大于等于1000,小于10000),i确定时,另一个数范围随之确定

for (int j = from; j < to; j++) {

i_val= i *j;if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {//(i_val - i - j) % 9 != 0 的理解://假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x =//10a + b, y = 10c + d//可得val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c),//所以val - x - y能被9整除。//满足该条件的数字必定能被9整除,可以直接过滤其他数字。

continue;

}

ar_str1= String.valueOf(i_val).split("");

ar_str2= (String.valueOf(i) + String.valueOf(j)).split("");

Arrays.sort(ar_str1);

Arrays.sort(ar_str2);if(Arrays.equals(ar_str1, ar_str2)) {

sum++;

System.out.println("第" + sum + "组: " + i + "*" + j + "=" +i_val);

}

}

}

System.out.println("方法2共找到" + sum + "组吸血鬼数");

}private static voidfun3() {int sum = 0;for (int i = 11; i < 100; i++) {for (int j = i; j < 100; j++) {int k = i *j;//有另一种变为字符串来操作,比较发现下面的这种方法耗时更少

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

Arrays.sort(a);

Arrays.sort(b);if(Arrays.equals(a, b)) {

sum++;

System.out.println("第" + sum + "组: " + i + " * " + j + " = " +k);

}

}

}

System.out.println("方法3共找到" + sum + "组吸血鬼数");

}private static voidfun4() {//逆向思维

String[] targetNum = null;

String[] gunNum= null;int sum = 0;for (int i = 10; i < 100; i++) {for (int j = i + 1; j < 100; j++) {//没有哪个两位数满足ab*ab=abab,所以这里j从i+1开始就可以了

int i_target = i *j;if (i_target < 1000 || i_target > 9999)continue; //积不是4位数则跳过

targetNum = String.valueOf(i_target).split("");

gunNum= (String.valueOf(i) + String.valueOf(j)).split("");

Arrays.sort(targetNum);

Arrays.sort(gunNum);if(Arrays.equals(targetNum, gunNum)) {

sum++;

System.out.println("第" + sum + "组: " + i_target + "=" + i + "*" +j);

}

}

}

System.out.println("方法4找到" + sum + "个吸血鬼数字。");

}

}

java 吸血鬼数字_JAVA_吸血鬼数字 多种方法实现相关推荐

  1. java 获取用户的MAC地址多种方法实例详解

    java 获取用户的MAC地址多种方法实例详解 这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下 java实现获取用户的MAC地址方法: 方法一:将本机地址与局域 ...

  2. java 中常用方法_java_中常用的方法总结

    8月1日 练习: 合理覆盖Cat数据类型的,equals()方法 Cat.java 1 覆盖hashCode() 返回的整型值是唯一的 int    hashCode() 用法: 一般使用String ...

  3. java怎么实现字符串反转_Java多种方法实现字符串反转!

    来自牛客网 题目描述 接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000). 示例  输入:abcdefg 输出:gfedcba 解决思路 (主函数中实现)1. ...

  4. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  5. java吸血鬼数字_吸血鬼数字的简单实现

    从think in java上面看到的吸血鬼数字,自己写了一个简单的实现 package com.zyl; import java.util.ArrayList; import java.util.A ...

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

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

  7. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)

    6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...

  8. python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法

    str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() ...

  9. 素数判断的java方法_java判断数字是否是素数的方法

    java判断数字是否是素数的方法 发布时间:2020-06-25 15:22:15 来源:亿速云 阅读:90 作者:Leah 本篇文章给大家分享的是有关java判断数字是否是素数的方法,小编觉得挺实用 ...

最新文章

  1. 恢复WORD2010的默认模板2011-05-03
  2. 前端DevOps之PageSpeed Insights
  3. 优秀学生专栏——王浩
  4. 【渝粤题库】陕西师范大学164104 网络财务管理 作业(高起专)
  5. android开发之shape详解
  6. go设置后端启动_使用 Go Wails 框架来构建桌面应用(Go+Vue.js)
  7. Oracle 与 MySql 区别
  8. 0130 - 构建业务的能力
  9. git push 冲突
  10. css focus 选择器用于选取获得焦点的元素
  11. 平均聚类系数_聚类方法排除CPU用量误报警
  12. 安卓源码下载的环境搭建
  13. idm站点抓取不了html,IDM站点抓取功能使用详解(下)
  14. 穿透内网群晖NAS实现远程访问【无公网IP】
  15. 0.Mysql数据库——创建数据库
  16. 湛蓝代码自动生成工具有感
  17. matlab散点图加图例,将图例添加到图 - MATLAB Simulink - MathWorks 中国
  18. MBR与GPT,BIOS与UEFI..总结
  19. 精通linux内核年薪,最新IT人才薪酬体系一览表
  20. php实现Web消息推送框架

热门文章

  1. python之具名元组
  2. 入门必看,快速判断mos管封装引脚的三个极和它的好坏
  3. 小猫排队 (思维 模拟
  4. centos7安装ifconfig命令
  5. 在网页中内嵌视频,例如优酷
  6. rog魔霸新锐2022款 评测 怎么样
  7. 任天堂Switch便携底座方案
  8. server 服务器文档,服务器文档,server document,音标,读音,翻译,英文例句,英语词典...
  9. 德阳五中高考2021年成绩查询,德阳五中2021年统招分数线是多少?
  10. 小程序运营推广怎么做?有什么小程序运营推广策略?