Java杂谈——求所有的4位吸血鬼数字
Java杂谈篇(一)
- 【求所有的4位吸血鬼数字】
- 1、什么是吸血鬼数字?
- 2、方法思考
- 2.1、各种方法
- 2.2、关于上述第二个解决方法的解析
- 2.2.1、方法详情
- 2.2.2、方法详解
- 3、运行结果
【求所有的4位吸血鬼数字】
1、什么是吸血鬼数字?
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。——百度百科
由于问题只是4位的吸血鬼数字,那么就很明确了,我们需要找的是某一个数字“abcd”,符合以下条件:
- abcd = ab*cd
- 以两个0结尾的数字是不允许的
2、方法思考
2.1、各种方法
关于这个问题,各种博客论坛都已有了许许多多的解决方法,以下是我认为比较简洁清晰的解释:
- https://blog.csdn.net/u011289652/article/details/73175530
- https://bbs.csdn.net/topics/300036468
2.2、关于上述第二个解决方法的解析
这是我搜集到的需要执行运算最少的方法,下面给出我的理解:
2.2.1、方法详情
import java.util.Arrays;
/** 吸血鬼数字;* 一个偶位数字(本题要求为4位),可以拆分为2个该数字位/2的数字的乘积,顺序不限。*/
public class VampireNumbers {public static void main(String[] arg) {String[] ar_str1, ar_str2;int sum = 0;int minInt;int maxInt;int num;int time = 0;for (int i = 10; i < 100; i++) {minInt = Math.max(1000 / i, i + 1);maxInt = Math.min(10000 / i, 100);for (int j = minInt; j < maxInt; j++) {num = i * j;// if (num % 100 == 0 || (num - i - j) % 9 != 0) {continue;}time++;ar_str1 = String.valueOf(num).split("");ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");Arrays.sort(ar_str1);Arrays.sort(ar_str2);if (Arrays.equals(ar_str1, ar_str2)) {sum++;System.out.println("第" + sum + "组: " + i + "*" + j + "=" + num);}}}System.out.println("共找到" + sum + "组吸血鬼数");System.out.println("运算次数:" + time);}
}
2.2.2、方法详解
1、开头的双层循环部分:
- 先简单的解释
maxInt = Math.min(10000 / i, 100);
,这个式子中min方法的第二个参数100是作为最大值限制参数j的,第一个参数中的10000/i是为了限制不让i*j大于4位数。但是因为i的范围是10~99,得到的最小值一直是100,所以这段代码也完全可以直接写成maxInt = 100;
。 - 其次是关于
minInt = Math.max(1000 / i, i + 1);
的作用。首先其中的1000 / i
的作用就是保证i * j
的结果一定能达到四位数,这也起到了筛选的作用,i + 1
则是保证了所有的遍历不会出现类似于发现aaaa=xymn的情况后又有aaaa=mnxy的情况。
2、双层循环中的if条件:
num % 100 == 0
:由于吸血鬼数字不允许出现两个两位数都以0结尾的情况,而这种情况导致的结果就是i*j必然是100的倍数,所以只要把着各种情况筛选出去就能避免,(num - i - j) % 9 != 0
:由于四位数abcd是1000a+100b+10c+d,而i和j都是10x+y的格式,那么无论是什么数字的组合,用num - i - j
计算的结果都必然是9的倍数,所以把不是的情况筛选出去即可。
3、确认得到的结果:
通过上述的筛选后,基本已经完成了大部分数字的筛选,现在遍历得到的数字都是符合条件的,只要找到所用数字相同的即可。
- 将四位数转化为字符串并生成字符串数组,将两个两位数转化为字符串并连接,同样生成字符串数组。
ar_str1 = String.valueOf(num).split("");ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");
- 将两个字符串数组分别排序
Arrays.sort(ar_str1);
Arrays.sort(ar_str2);
- 排序后进行比较,如果相同则表明是一组吸血鬼数字:
if (Arrays.equals(ar_str1, ar_str2))
3、运行结果
Java杂谈——求所有的4位吸血鬼数字相关推荐
- java吸血鬼_4位吸血鬼数字的java实现思路与实例讲解
这个问题来源于java编程思想一书,所谓"吸血鬼数字"就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列. ...
- 4位吸血鬼数字的实现代码与解释
今天在<Java编程思想>第四章中看到一道练习题,写程序找到所有的4位吸血鬼数字.因为第四章是讲控制流程,一开始始终将思路局限于利用循环进行穷举,但越想越复杂,最后查阅了相关资料,总结出了 ...
- java 4位数,java 找出4位数的所有吸血鬼数字
java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...
- Java 找出四位数的所有吸血鬼数字 基础代码实例
/** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. * 以两个 ...
- Java 四舍五入求百分数 保留两位保留整数
前言 给定要给Double类型数字,四舍五入求百分数,可以保留整数 两位 0.441876900638 ==>44.19% or 44% 用拓展的方法 操作 //截取double num = D ...
- Java基础求质数——接收用户输入的数字,判断是否为质数
首先,我们要知道质数是什么: 概念:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,也称为素数. 规定:0和1既不是质数,也不是合数,最小的质数为2 思路1:将这个数放在一个循 ...
- java中整形_java中怎样实现60多位整形数字的运算
java中怎样实现60多位整形数字的运算 (2011-09-20 10:57:59) 标签: 杂谈 import java.math.BigInteger; import java.util.Scan ...
- java编程找出吸血鬼数字,Java 找到四位数的所有吸血鬼数字 基础代码实例
Java 找出四位数的所有吸血鬼数字 基础代码实例 /** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最 ...
- Thinking in Java之吸血鬼数字
今天学习了Java的流程控制的内容,基本与C语言一样,只不过是Java多了foreach语句的一种用法,相对于C语言来说方便了很多.看了最后一道习题,是关于吸血鬼数字的,比较感兴趣于是就写了代码. ...
最新文章
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)【转】
- 怎样才算熟悉python-怎么样才算是精通 Python?
- Mac-连接Windows远程桌面软件
- EntityFramework(EF)贪婪加载和延迟加载的选择和使用
- Pytorch 加载预训练模型参数时出现size mismatch错误
- FFmpeg的C++封装:FFmpegWrapper
- 跨模块中的分配内存问题
- Acwing第 34 场周赛
- JavaScript中Switch语句支持字符串类型数据
- 06_JavaEE回顾笔记Ⅱ
- 怎样将excel表格导入天正_天正无法导入excel表格
- 屏幕写画和缩放:ZoomIt【转】
- 美团上线美团直播助手
- Uber面向中印开发者公布SDK,支持第三方应用集成服务
- LaTeX--1--了解LaTeX
- 使用python和opencv进行人脸识别时遇到cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-buil
- 手码万字-带你全面了解存储基础知识
- 酒店点菜系统c语言,求一个用最基础的C语言编写的简单饭店点菜系统
- 如何在Debian 9上安装和使用Docker
- 渗透工具之CS4.0使用说明书