/*吸血鬼数字是指位数为偶数的数字,可以由一

* 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,

* 其中从最初的数字中选取的数字可以任意排序。

* 以两个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

for(int j=i;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;

}

}

吸血鬼数字java_Java求吸血鬼数算法(通用)相关推荐

  1. java吸血鬼数字_[求助]吸血鬼数字

    [求助]吸血鬼数字 public class xixuegui { public static void main (String[] args) { int i,j,k,a,b,c,d,n,m; f ...

  2. 怎样轻松找出4位数的所有“吸血鬼”数字,多种高效算法详解

    关于吸血鬼数字算法问题,我也是读<java编程思想>中遇到的,觉得很有意思.于是,就去做了做.但因为我的粗心,读题的时候忽略了点问题,所以导致我的思路出现了岔口!(当时的思路就是想着把一个 ...

  3. Java 吸血鬼数字

    很惭愧(其实没什么惭愧,水平就这样),搞了半晌才写出来了一个Java 版求四位吸血鬼数字的方法 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最 ...

  4. java 吸血鬼数字_java编程思想之吸血鬼数字

    我觉得×××,所以我来了. -------------------------- 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取 ...

  5. java 吸血鬼数字_用java求吸血鬼数字 | 学步园

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

  6. Java杂谈——求所有的4位吸血鬼数字

    Java杂谈篇(一) [求所有的4位吸血鬼数字] 1.什么是吸血鬼数字? 2.方法思考 2.1.各种方法 2.2.关于上述第二个解决方法的解析 2.2.1.方法详情 2.2.2.方法详解 3.运行结果 ...

  7. java编程——吸血鬼数字(四位)

    从<Thinking in Java>(中文第四版)中第4章的练习10看到"吸血鬼数字",特编程实现,以下为3种算法(针对四位数的)及其对比: 首先解释一下吸血鬼数字: ...

  8. java吸血鬼_4位吸血鬼数字的java实现思路与实例讲解

    这个问题来源于java编程思想一书,所谓"吸血鬼数字"就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列. ...

  9. Java实现吸血鬼数字

    题目描述:找出所有四位数的吸血鬼数字. 实验思路: 首先从吸血鬼数字本身考虑,则从1000遍历到9999.这需要找出每一个数字的是否存在对应的一对因子使之满足吸血鬼数字的条件,此方法工作量大且算法难以 ...

最新文章

  1. 226. Invert Binary Tree 翻转二叉树
  2. linux和用户账户相关的系统文件
  3. 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
  4. 每日一练(8)—— 野指针
  5. oracle安装需要的包列表
  6. Spring Boot集成Redis,这个坑把我害惨了!
  7. SQL Server里的 ISNULL 与 NULLIF
  8. H264视频解码器C++工程说明
  9. 一个程序员的科幻小说
  10. 企业数据战略中,什么样的数据才能算是真正的数据资产
  11. 西安到底需不需要互联网?
  12. 概率论基础-泊松分布计算近似概率
  13. Android性能优化系列之apk瘦身
  14. 【黑马头条训练营】day02-黑马头条-App端文章展示
  15. UniSwap V3协议浅析(上)
  16. 读写超快的随身存储好物,设计也很漂亮,大华S809固态U盘上手
  17. Linux串口调试助手
  18. RHCE(tuend,stratis,vdo)
  19. 【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
  20. 软件测试面试题--(含mysql,linux,出现最频繁)

热门文章

  1. 快速上手飞桨PaddleClas图像分类库
  2. 深度学习项目实战——木薯叶图像识别与分类项目
  3. MySQL5.7官方下载链接导航
  4. php设置时区的两种方法
  5. [4G5G专题-129]:RF-架构演进的驱动力与RF常见术语
  6. div显示在上层_如何让div总是显示在最上层,而不致于被其他div遮挡
  7. 解决Tomcat修改server.xml和content.xml后自动还原问题
  8. Excel应用技巧:单元格文字的拆分与合并
  9. VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充
  10. 【算法导论-主定理】用主方法求解递归式 学练结合版