找出"吸血鬼数"(Java)
吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个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)的更多相关文章
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
- 找出一堆数中最小的前K个数
描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...
- 在数组中找出两数之和为10的所有组合(JAVA)
/*利用冒泡排序实现*/ import java.util.Scanner;public class Paixun { public static void main(String[] args) { ...
- ✡ leetcode 163. Missing Ranges 找出缺失范围 --------- java
Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], ...
- 一个排好序的数组,找出两数之和为x的所有组合【双指针】
#include <bits/stdc++.h> using namespace std; const int N = 1e6,INF = 0x3f3f3f3f; int a[N]; in ...
- 排好序的数组中,找出两数之和为m的所有组合
public static void main(String[] args) { int[] a = {1,2,2,3,3,4,5,6}; int m = 6; normal(a, m); } //正 ...
- Java求吸血鬼数算法(通用)
/*吸血鬼数字是指位数为偶数的数字,可以由一 * 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 以两个0结尾的数字是不允许的. * * ...
- 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)
1. cv2.matchTemplate(src, template, method) # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...
- 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数
一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...
随机推荐
- C++中cout和cerr
参考:https://blog.csdn.net/garfield2005/article/details/7639833 之前一直在用,但就是没在意两者到底有啥却别,今天又想到这个问题,总结下吧(以 ...
- Docker笔记5:实现加速器,加快下载/拉取镜像速度
由于 Docker 官方仓库存储于国外服务器,因此,我们使用d ocker pull 命令拉取镜像时,速度很慢.但是,我们可以使用国内服务商提供的加速器进行加速,加速器实质是一个IP地址,将其加入到d ...
- ansible-playbook文件复用
1. ansible-playbook文件复用 1.1) include 和 import区别 include(动态):在运行时导入 --list-tags,--list-tasks不会显示到输出 ...
- ps 安装 ps 2017 下载 及教程(保姆式教程)
链接:https://pan.baidu.com/s/1GJHiwmxwRApFYhyNZBCQtQ 提取码:7r6u 以上是百度网盘的地址. 1.下载解压安装前先断网在安装点击set-up 软件,之 ...
- 强大的table组件-antd pro table
概述 antd pro table antd pro table 的主要部分 表格显示的配置(绿色框内) 检索的配置(红色框内) 是否显示检索部分 检索的内容是如何生效的 工具栏的配置(黄色框内) 表 ...
- OpenStack最新版本--Victoria发布亮点与初体验
前言 `OpenStack`是一个云操作系统,可控制整个数据中心内的大型计算,存储和网络资源池,所有资源均通过具有通用身份验证机制的`API`进行管理和配置. 还提供了一个仪表板,可让管理员进行控制, ...
- win10的cortana搜索显示空白
解决方法:重置应用 问题原因:待查明 然后,我们往下拉
- day44 Pyhton 数据库Mysql
内容回顾 什么是进程? 就是为了形容执行中的程序的一种称呼 它是操作系统中资源分配的最小单位 进程之间是数据隔离的,占用操作系统资源相对多 独立存在的 谈谈你对并发的理解 同时有多个任务需要执行,但是 ...
- spring框架中配置mysql8.0需要注意的地方(转载)
8.0以后的mysql很强大,但是配置写法出现了不同 主要原因是时区不同,mysql默认用的是国外某个地方的时区,而我们要用的话用使用东八时区,这是中国统一时区. 装载自https://blog.cs ...
- Django基础之Ajax
知识预览 Ajax前戏:json Ajax简介 Jquery实现的ajax JS实现的ajax Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object Nota ...