/*吸血鬼数字是指位数为偶数的数字,可以由一
* 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,
* 其中从最初的数字中选取的数字可以任意排序。
* 以两个0结尾的数字是不允许的。
*
* 1994年柯利弗德·皮寇弗在Usenet社群sci.math的
* 文章中首度提出吸血鬼数。后来皮寇弗将吸血鬼数
* 写入他的书Keys to Infinity的第30章。
*
* 以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
* 1260 = 21 * 60  1827 = 21 * 87  2187 = 27 * 81
* 4位数的吸血鬼数有7个:
* 1260, 1395, 1435, 1530, 1827, 2187, 6880
* */ /*算法思路
* 1.获取符合吸血鬼数的范围值(范围值容易理解不再多说)
* 2.从范围值中算出吸血鬼数
* a).从吸血鬼的定义中取得条件:
* 一,大于4位的偶数;
* 二,两个乘数的位数分别占吸血鬼数位数的一半;
* 三,以两个0结尾的数字是不允许的;
* 四,两个乘数的数字与乘积的数字排序后一一对应;
*(不是相等,是一一对应,因为有0的吸血鬼数的数字排序后0在前面,重点)
* 作者:Jack.Yan 完成时间:2017/12/19
* */ public class DanforhanTest { public static void main(String[] args) { //参数为吸血鬼数字的位数,只可为偶数
getVampireNum(8); //这里实参为8,即找出 8 位的吸血鬼数;
//此方法返回值为void,只是把找出的吸血鬼数打印出来. } public static void getVampireNum(int count){ if(count<4 && count%2 != 0) //限制为偶数位数且至少为4位
return; // 4 6 8
// 0 1 2 3 0 1 3 4 0 1 4 5
//这些数字分别为求得 num1,num2,num3,num4 的幂值,即 10^n
//这里列出为了让读者易于理解下面的代码
/*例如:4位的吸血鬼数,两个乘数最小的起始值为 10,
*达到的最大值为99(因为两个乘数分别占吸血鬼数位数的一半)
*而4位的吸血鬼数的范围值为 1000 至 9999*/ //num1为 两个乘数最小的起始值
int num1 = (int)Math.pow(10,count-(count/2+1));
//num2为 两个乘数达到的最大值为(下面 if 中判断是 i <= num2 , j <= num2 ;所以要减去 1)
int num2 = (int)Math.pow(10,count-(count/2)) - 1; //num3 和 num4 为四位吸血鬼数的范围值
int num3 = (int)Math.pow(10,count-1);
int num4 = (int)Math.pow(10,count) - 1; //i 为左边乘数 j 为右边乘数;k 记录吸血鬼数个数
int i=num1,j=i;int k=0;
outer:
while(true){
i++;
if(i <= num2){
j = i; // j不赋num1值而赋i的值,是为了避免反向相乘例如 (15 * 30 和 30 * 15)
while(true){
j++;
if (j <= num2){ if (i*j < num3){
continue; }else if (i*j <= num4){ if(VampireNum(i,j,i*j)){ //调用方法,返回true则是吸血鬼数,打印
System.out.println(i+" * "+j+" = "+i*j);
k++;
} }else{ // 计算结果超出了范围值
continue outer;// 跳出整个循环
} }else{
break;
} } }else{
break;
} }
System.out.println(count+"位的吸血鬼数有"+k+"个");
} private static boolean VampireNum(int x,int y,int w){ if(w%100 == 0) //排除所有两个00结尾的数字
return false; String str_xy = Integer.toString(x);
str_xy += Integer.toString(y); /*两个乘数合并为一个字符串*/
String str_w = Integer.toString(w); //将乘数和乘积数转为 char[] ,然后排序和比较
char charXY[] = str_xy.toCharArray();
char charW[] = str_w.toCharArray(); //排序 (这里要提高性能可以选择java类库中的方法;为了清晰可见,这里自己写了冒泡排序) char tmp = '0';
for(int i=0;i<charXY.length-1;i++){
for(int j=i;j<charXY.length;j++){
if(charXY[i] > charXY[j]){
tmp = charXY[i];
charXY[i] = charXY[j];
charXY[j] = tmp;
} if(charW[i] > charW[j]){
tmp = charW[i];
charW[i] = charW[j];
charW[j] = tmp;
}
} } //比较
int res = 0;
for(int i =0;i < charW.length;i++){
if(charXY[i] == charW[i])
res ++;
} //完全配对则为吸血鬼数
if(res == charW.length)
return true;
else
return false; } }

  JackYan.print(" 祝大家2018元宵节快乐!");

Java求吸血鬼数算法(通用)的更多相关文章

  1. Java实现 蓝桥杯VIP 算法训练 求完数

    问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例输出 与上面的样例输入对应的输出. 例: 数据规模和约定 1-9999 publi ...

  2. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  3. 蓝桥杯 算法训练 ALGO-152 8-2求完数

     算法训练 8-2求完数   时间限制:50.0s   内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例 ...

  4. 找出"吸血鬼数"(Java)

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

  5. JAVA 基础编程练习题9 【程序 9 求完数】

    9 [程序 9 求完数] 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如 6=1+2+3.编程找出 1000 以内的 所有完数. package cskaoyan ...

  6. 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现

    直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...

  7. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  8. Rsa加解密Java、C#、php通用代码 密钥转换工具

    之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...

  9. TripleDES加解密Java、C#、php通用代码

    TripleDES说明:     TripleDES(3Des)和Des都是对称加密算法,TripleDes是Des加密算法的增强版本,这里主要说的是TripleDes加密算法的应用.     工作中 ...

随机推荐

  1. .net core跨平台应用研究-ubuntu core下配置.net core运行时

    引言 年初研究了一阵子.net core跨平台应用,先后发表了几篇应用研究的文章.因工作原因,忙于项目上线,有一阵子没来博客园写文章了.最近项目基本收尾,抽空翻了下自己的博客,廖廖几篇文章,真让人汗颜 ...

  2. Java基础(42)AbstractSet类

    AbstractSet类的子类有HashSet(其子类是LinkedHashSet).EnumSet.TreeSet 1.HashSet public class HashSet<E> e ...

  3. JVM(4) 类文件结构

    一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...

  4. gulp源码分析

    一.整体结构分析 整体结构 通过在nodejs环境对源码的打印,我们最终得到的gulp实例行如下图.那么我们gulp实例上的属性和方法是如何生成的呢? Gulp { domain: null, _ev ...

  5. .NET进阶篇05-Linq、Lambda表达式

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.Lambda表达式1.匿名方法2.Lambda表达式二.Linq概述三.查询操作符1.linq初见2.常用查询操作符筛选排序分组连 ...

  6. MacOS 系统 文件夹解析

    Mac OS X,基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力. 通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体支持和集成的PDA功能 ...

  7. (Java) Md5Utils

    package com.vcgeek.hephaestus.utils; import java.security.MessageDigest; public class Md5Utils { /** ...

  8. JVM参数及调优

    ## 3.2.1 JVM参数及调优 ### 调优基本概念 在调整JVM性能时,通常有三个组件需要考虑:1. 堆大小调整2. 垃圾收集器调整3. JIT编译器 大多数调优选项都与调整堆大小和选择合适的垃 ...

  9. CVE-2019-16097:Harbor任意管理员注册漏洞复现

    0x00 Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distri ...

  10. NOIP模拟 13

    我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...