Description

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字的位数是原数字的一半位数,并且由组成原数字的各个位数组成,以两个0结尾的数字不是吸血鬼数字。
例如:1260 = 21 * 60 1827 = 21 * 87 2187= 27 * 81
求所有四位吸血鬼数字

解决方案一(逆向思维)

  • Analyse
    通常思维是枚举所有的四位数来找出所有符合条件的吸血鬼数,然而,算法需要枚举的数实在是太多了,四位数的个数为9000个(我们暂且做粗略考虑,不做精细打算),算法的时间复杂度相对较高。逆向思维是,因为分解的乘数都是两位数,所以列举所有的两位数,求得结果要为四位数,再进一步判断是否满足吸血鬼数的条件(需要枚举的个数低于9000不要太多)。

  • 设置过滤条件
    为了让算法更高效率的进行,就需要过滤一些可以迅速判断出不符合条件的枚举。
    value=i*j (其中i < j,10 <= i <= 99)
    判断j的循环范围,就至少需要两者的乘积可以构成四位数,所以1000/i和10000/i是一个界限。为了避免出现重复的乘积,还需和i+1比较大小。
    假设value = 1000a + 100b + 10c + d, 因为满足val = i * j, 则有x = 10a + b, y = 10c + d
    则value - i - j = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以value - i - j能被9整除,其他的数位组合也是一样的,可以试一试(我是没想出来这个条件,只是在网上看到的,所以说啊,算法好就需要数学好!)。
    所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。

  • 源代码
import java.util.Arrays;class Vampire{/** 求出所有四位数的吸血鬼数*/public static void main(String[] args){int value;String[] sij;String[] sv;int count=0;    //计数总共对比数据相等多少次,用以判断算法性能int sum=0;        //用以记录吸血鬼数的个数//i:两个乘数中较小的一个,j:两个乘数中较大的一个for(int i=10; i<100; i++){int begin=Math.max(1000/i, i+1);int end=Math.min(9999/i, 99);for(int j=begin; j<=end; j++){value=i*j;if(value%100==0||(value-i-j)%9!=0)continue;count++;     //进入到比较阶段sij=(String.valueOf(i)+String.valueOf(j)).split("");sv=String.valueOf(value).split("");Arrays.sort(sij);Arrays.sort(sv);//将数组的内容进行比较if(Arrays.equals(sij,sv)){sum++;System.out.println("第"+sum+"组: "+i+"*"+j+"="+value);  }}}System.out.println("共找到"+sum+"组吸血鬼数");System.out.println("对比字符串数组次数:"+count);}
}
  • 运行结果
第1组: 15*93=1395
第2组: 21*60=1260
第3组: 21*87=1827
第4组: 27*81=2187
第5组: 30*51=1530
第6组: 35*41=1435
第7组: 80*86=6880
共找到7组吸血鬼数
对比字符串数组次数:232

吸血鬼数(Java实现)相关推荐

  1. 吸血鬼数字 java_找出吸血鬼数(Java)

    importjava.util.ArrayList;importjava.util.Arrays;/*** 先从1001开始到9999开始判断,是否能分解为两个二位数,如果可以,二维数是否包含所有四个 ...

  2. java吸血鬼_吸血鬼数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码: /** * 功能:找出四位数中由二位数相乘得出的吸血鬼数 * @author wiley */public class Vampire { pub ...

  3. 吸血鬼 java_吸血鬼数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码: /** * 功能:找出四位数中由二位数相乘得出的吸血鬼数 * @author wiley */public class Vampire { pub ...

  4. 吸血鬼数字java_Java求吸血鬼数算法(通用)

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

  5. ThinkingInJava_吸血鬼数

    package java_001;import java.util.Arrays;/*** Thinking in Java*吸血鬼数字是指位数为偶数的数字,可由一对数字相乘而得到,*这对数字各包含乘 ...

  6. php反序列化java.long_细数java中Long与Integer比较容易犯的错误总结

    今天使用findbugs扫描项目后发现很多高危漏洞,其中非常常见的一个是比较两个Long或Integer时直接使用的==来比较. 其实这样是错误的. 因为Long与Ineger都是包装类型,是对象. ...

  7. java阿姆斯特朗数,Java判断阿姆斯特朗数

    Java判断阿姆斯特朗数 1 什么是阿姆斯特朗数 Java中的阿姆斯壮数字:如果正数等于其数字的立方之和,例如0.1.153.370.371.407等,则称为阿姆斯特朗数. 让我们尝试了解为什么153 ...

  8. 1000以内完数Java程序

    1000以内完数Java程序编写: public class lei1 { /*** @param args*/ public static void main(String[] args) {// ...

  9. 输出1~1000之间能被3整除又可以被7整除的数 java

    输出1~1000之间能被3整除又可以被7整除的数 java public class Asak {public static void main(String[] args) {Scanner s = ...

最新文章

  1. web项目性能优化--网络、js、渲染
  2. Ubuntu18.04 VMtools的安装与卸载
  3. awk的正则表达式提取
  4. 【课件】基础雷达信号处理
  5. 计算机社团优秀成员申请书,优秀社团的成员申请书
  6. Java程序猿必读的书籍,良心推荐!
  7. C++ vector容器删除操作
  8. vim tutor summary
  9. linux查看分区树形状态,查看Linux磁盘的分区状态(lsblk、blkid、parted)
  10. 2017.10.2 loli测试
  11. 【ubuntu】给新装好的UBUNTU系统配置静态IP
  12. Number and String in JS
  13. matlab 坐标轴根号,Matlab中根号表示怎么操作?根号表示教程分享
  14. java发布帖子_第一篇发在javaeye的帖子
  15. 计算机用三角函数时如何用弧度制,弧度制 三角函数的简单应用
  16. Windows系统下的Git安装教程
  17. JavaEE 微信境外支付
  18. MySQL 基于MyCAT配置数据分片
  19. 第二十章:异步和文件I/O.(十九) 1
  20. WebShell -- Linux反弹

热门文章

  1. 日期及日期字符串比较大小
  2. 编程入门--前端和后端
  3. 自动驾驶软硬件解耦:理想丰满,现实骨感
  4. Qt [GC9-23]:模拟汽车上电液晶仪表部分
  5. 深度学习 --- 循环神经网络RNN详解(BPTT)
  6. 解决弹出的窗口window.open会被chrome浏览器阻止的问题
  7. JavaScript-流程控制语句(笔记)
  8. 单片机毕业设计 STM32智能无线防盗报警器 - 物联网 嵌入式
  9. JAVA毕业设计科研团队管理系统计算机源码+lw文档+系统+调试部署+数据库
  10. 枚举——用enum代替int常量