吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是 “吸血鬼”数字:
1260=21 * 60
1827=21 * 87
2187= 27 * 81

那么,开始

由于判断四位数是否能分解为两个两位数的乘积,比判断两位数的乘积所得四位数的,要麻烦得多,因此思路为后者。

import java.util.ArrayList;
import java.util.Arrays; /**
* 先从1001开始到9999开始判断,是否能分解为两个二位数,如果可以,二维数是否包含所有四个数字
* 把四位数分解成二位数乘积过于麻烦,而且一个四位数可能存在多种分解方式,加大了设计的难度
* 但是反过来,二位数乘以二位数简单得多,此时再去判断即可
* 将积分解成四个数位,存入数组。两个乘数分别分解成两个数位,存入一个数组
* 将两个数组排序,按照下标逐个比较,如果两个数组相同,返回true
* @author zhaoke
*
*/
public class Vampire { //冒泡排序法
public void sort(int[] array) {
for (int i = 0; i < array.length-1; i++) {
for (int j = i+1; j < array.length; j++) {
if (array[i] > array[j]) {
//交换两个数的位置
array[i] = array[i] - array[j];
array[j] = array[i] + array[j];
array[i] = array[j] - array[i];
}
}
}
} /**
* 判断四位数分解后的数位(存在数组里),是否恰好包含两个乘积因子的所有数位
* 为了简单起见,方法是先排序,然后比较两个数组是否相同
*/
public boolean check(int[] digits, int num1, int num2) {
this.sort(digits);
// System.out.println(Arrays.toString(digits)); int[] factors = new int[4];
//分离第一个乘数的两个数位
int[] numArray = this.divideNumber(num1);
for (int i = 0; i < 2; i++) {
factors[i] = numArray[i];
}
//分离第二个乘数的两个数位
numArray = this.divideNumber(num2);
for (int i = 2; i < 4; i++) {
factors[i] = numArray[i-2];
}
this.sort(factors);
// System.out.println(Arrays.toString(factors));
for (int i = 0; i < digits.length; i++) {
if (digits[i] != factors[i]) {
return false;
}
}
return true;
} public int[] divideNumber(int number) {
int[] digits = new int[2];
digits[0] = number/10;
digits[1] = number - 10*(number/10);
return digits;
} /**
* 获得每个位的数字
*/
public int[] divideArray(int number) {
int[] digits = new int[4];
int factor = 1000;
for (int i = 0; i < digits.length; i++) {
digits[i] = number/factor;
number -= digits[i] * factor;
factor /= 10;
}
return digits;
}
ArrayList<Integer> result = new ArrayList<Integer>(); /**
* 10*99小于1000,因此从11开始循环
*/
public void start() {
int count = 0; //计数器而已
for (int i = 11; i < 100; i++) {
for (int j = 11; j < 100; j++) {
if (i*j <1000)
continue;
if (i*j%100==0) {
//根据题目,如果最后两位是0,也不可
continue;
}
int[] digits = divideArray(i*j);
if (this.check(digits, i, j)) {
if (this.result.contains(i*j))
continue;
this.result.add(i*j);
System.out.printf("第%d个吸血鬼数: %d = %d x %d \n",++count,i*j,i,j);
}
}
}
} public static void main(String[] args) {
Vampire v = new Vampire();
v.start();
} }

结果如下:

第1个吸血鬼数: 1395 = 15 x 93
第2个吸血鬼数: 1260 = 21 x 60
第3个吸血鬼数: 1827 = 21 x 87
第4个吸血鬼数: 2187 = 27 x 81
第5个吸血鬼数: 1530 = 30 x 51
第6个吸血鬼数: 1435 = 35 x 41
第7个吸血鬼数: 6880 = 80 x 86

总结:逆向思维,模块化设计

找出"吸血鬼数"(Java)的更多相关文章

  1. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  2. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  3. 在数组中找出两数之和为10的所有组合(JAVA)

    /*利用冒泡排序实现*/ import java.util.Scanner;public class Paixun { public static void main(String[] args) { ...

  4. ✡ leetcode 163. Missing Ranges 找出缺失范围 --------- java

    Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], ...

  5. 一个排好序的数组,找出两数之和为x的所有组合【双指针】

    #include <bits/stdc++.h> using namespace std; const int N = 1e6,INF = 0x3f3f3f3f; int a[N]; in ...

  6. 排好序的数组中,找出两数之和为m的所有组合

    public static void main(String[] args) { int[] a = {1,2,2,3,3,4,5,6}; int m = 6; normal(a, m); } //正 ...

  7. Java求吸血鬼数算法(通用)

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

  8. 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

    1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...

  9. 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数

    一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...

随机推荐

  1. 【题解】[SCOI]windy数

    Link 题目大意:求给定一个区间内满足每一位的数相差大于\(2\)且没有前导零的数的个数. \(\text{Solution:}\) 我们可以按照数位\(dp\).设状态为当前要\(dp\)第\(p ...

  2. juc包:使用 juc 包下的显式 Lock 实现线程间通信

    一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...

  3. JAVA学习线路:day01面向对象(继承、抽象类)

    所有的文档和源代码都开源在GitHub: https://github.com/kun213/DailyCode上了.希望我们可以一起加油,一起学习,一起交流. day01面向对象[继承.抽象类] 今 ...

  4. Docker笔记2:Docker 镜像仓库

    Docker 镜像的官方仓库位于国外服务器上,在国内下载时比较慢,但是可以使用国内镜像市场的加速器(比如阿里云加速器)以提高拉取速度. Docker 官方的镜像市场,可以和 Gitlab 或 GitH ...

  5. docker-管理镜像常用命令

    1. docker管理镜像常用命令 指令 说明 docker   run     [容器 CONTAINER ID] 创建一个新的容器并运行一个命令 docker   start   [容器 CONT ...

  6. thinkphp6.0.x 反序列化详记(一)

    前言 这几天算是进阶到框架类漏洞的学习了,首当其冲想到是thinkphp,先拿thinkphp6.0.x来学习一下,体验一下寻找pop链的快乐. 在此感谢楷师傅的帮忙~ 环境配置 用composer指 ...

  7. 解决python的requests库在使用过代理后出现拒绝连接的问题

    在使用过代理后,调用python的requests库出现拒绝连接的异常 问题 在windows10环境下,在使用代理(VPN)后.如果在python中调用requests库来地址访问时,有时会出现这样 ...

  8. faker切换user-agent

    import random import requests url = "http://tool.yeves.cn" import faker fake = faker.Faker ...

  9. Python入门基础教程-准备工作

    作为一名Python的忠实爱好者,在Python的学习过程中趟过了很多坑.不论是在基础语法.爬虫.可视化的学习,亦或是在数据挖掘的项目开展中,整个过程有痛苦也有收获,有捶胸顿足也有仰天长笑.所以在以后 ...

  10. java 第一课 笔记

    java是一种解释型语言 Java提供了内存自动管理:不涉及指针:单继承. classpath:字节码文件的路径,执行java.exe时,会查找并解释*.class文件 set classpath=. ...