java 吸血鬼数字_JAVA_吸血鬼数字 多种方法实现
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_吸血鬼数字 多种方法实现相关推荐
- java 获取用户的MAC地址多种方法实例详解
java 获取用户的MAC地址多种方法实例详解 这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下 java实现获取用户的MAC地址方法: 方法一:将本机地址与局域 ...
- java 中常用方法_java_中常用的方法总结
8月1日 练习: 合理覆盖Cat数据类型的,equals()方法 Cat.java 1 覆盖hashCode() 返回的整型值是唯一的 int hashCode() 用法: 一般使用String ...
- java怎么实现字符串反转_Java多种方法实现字符串反转!
来自牛客网 题目描述 接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000). 示例 输入:abcdefg 输出:gfedcba 解决思路 (主函数中实现)1. ...
- 谈谈java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...
- java吸血鬼数字_吸血鬼数字的简单实现
从think in java上面看到的吸血鬼数字,自己写了一个简单的实现 package com.zyl; import java.util.ArrayList; import java.util.A ...
- java编程找出吸血鬼数字,找出四位數的所有吸血鬼數字(JAVA)
/** * 找出四位數的所有吸血鬼數字 * 吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序. * 以兩個0結尾 ...
- Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)
6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...
- python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法
str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() ...
- 素数判断的java方法_java判断数字是否是素数的方法
java判断数字是否是素数的方法 发布时间:2020-06-25 15:22:15 来源:亿速云 阅读:90 作者:Leah 本篇文章给大家分享的是有关java判断数字是否是素数的方法,小编觉得挺实用 ...
最新文章
- 恢复WORD2010的默认模板2011-05-03
- 前端DevOps之PageSpeed Insights
- 优秀学生专栏——王浩
- 【渝粤题库】陕西师范大学164104 网络财务管理 作业(高起专)
- android开发之shape详解
- go设置后端启动_使用 Go Wails 框架来构建桌面应用(Go+Vue.js)
- Oracle 与 MySql 区别
- 0130 - 构建业务的能力
- git push 冲突
- css focus 选择器用于选取获得焦点的元素
- 平均聚类系数_聚类方法排除CPU用量误报警
- 安卓源码下载的环境搭建
- idm站点抓取不了html,IDM站点抓取功能使用详解(下)
- 穿透内网群晖NAS实现远程访问【无公网IP】
- 0.Mysql数据库——创建数据库
- 湛蓝代码自动生成工具有感
- matlab散点图加图例,将图例添加到图
- MATLAB Simulink
- MathWorks 中国
- MBR与GPT,BIOS与UEFI..总结
- 精通linux内核年薪,最新IT人才薪酬体系一览表
- php实现Web消息推送框架
热门文章
- python之具名元组
- 入门必看,快速判断mos管封装引脚的三个极和它的好坏
- 小猫排队 (思维 模拟
- centos7安装ifconfig命令
- 在网页中内嵌视频,例如优酷
- rog魔霸新锐2022款 评测 怎么样
- 任天堂Switch便携底座方案
- server 服务器文档,服务器文档,server document,音标,读音,翻译,英文例句,英语词典...
- 德阳五中高考2021年成绩查询,德阳五中2021年统招分数线是多少?
- 小程序运营推广怎么做?有什么小程序运营推广策略?