吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个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. Java知识系统回顾整理01基础05控制流程04 for

    一.for 比较for和while public class HelloWorld { public static void main(String[] args) { //使用while打印0到4 ...

  2. vs调试程序缺少 msvcp140d.dll 解决方法

    简介一下吧: 如果只是为了解决问题请直接看第      7       点 ,谢谢. vs2013运行刚安装的opencv问题总结,尤其是电脑还很渣的情况下------花了我起码2天样子----很无奈 ...

  3. tuple的增删改查

    dict = {"k1": "v1", "k2": "v2", "k3": "v3&quo ...

  4. tslib-1.4移植(转)

    转自:http://blog.163.com/zhuandi_h/blog/static/180270288201222310291262/ 环境:host:Ubuntu11.10target:Oma ...

  5. SpringBoot+单机redis

    spring boot-redis集成 看教程来的,看起来很简单,但是集成后发现启动失败? WARN 2556 --- [ restartedMain] ationConfigEmbeddedWebA ...

  6. 多测师讲解requests __上_高级讲师肖sir

    1.三种接口接口请求方式 # # 在python当中接口的请求方式有哪些:# import requests # 导入requests接口库# # # # 请求方式有三种:# # # # 第一种:# ...

  7. day69:Vue:组件化开发&Vue-Router&Vue-client

    目录 组件化开发 1.什么是组件? 2.局部组件 3.全局组件 4.父组件向子组件传值 5.子组件往父组件传值 6.平行组件传值 Vue-Router的使用 Vue自动化工具:Vue-Client 组 ...

  8. spring boot:用cookie保存i18n信息避免每次请求时传递参数(spring boot 2.3.3)

    一,用cookie保存i18n信息的优点? 当开发一个web项目(非api站)时,如果把i18n的选择信息保存到cookie, 则不需要在每次发送请求时都传递所选择语言的参数, 也不需要增加heade ...

  9. linux(centos8):firewalld的运行时日志配置

    一,firewalld配置日志的用途: 在生产环境中,firewalld的默认配置是不记录日志 我们通过日志记录下防火墙过滤时拒绝的非法ip, 可以主动把这些有攻击性的ip加入到黑名单, 防患于未然 ...

  10. linux(centos8):用tr替换或删除字符

    一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...