java编程思想之吸血鬼数字

2023-10-08 18:48

本文主要是介绍java编程思想之吸血鬼数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我觉得是时候了,所以我来了。

--------------------------

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。

以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:   

1260 = 21 * 60   1827 = 21 * 87   2187 = 27 * 81

顺便介绍下伪吸血鬼数字:伪吸血鬼数和一般吸血鬼数不同之处在于其尖牙不强制是n/2个位的数,故伪吸血鬼数的位数可以是奇数。

--------------------------

我的程序是找出小于999999的吸血鬼数字。为了方便下面的叙述,将吸血鬼数字的等式定义为:a*b=c。

思路是两层循环,从10*10开始寻找。这里a、b、c都是整数,将它们转换为字符串数组形式,然后对其排序后的字符串进行比较。若两个字符串相等则为吸血鬼数字。看下面的代码:

importjava.util.*;
/**
* 吸血鬼数字
*
* @author Rlanffy
*
*/
publicclassVampire {
publicstaticvoidmain(String[] args) {
longt1 = System.currentTimeMillis();
String[] str1, str2;
intpro, sum = 0;
for(inti = 10; i < 1000; i++) {
for(intj = 10; j < 1000; j++) {
pro = i * j;
// 排除小于1000和大于999999的数字
if(pro < 1000|| pro > 999999)
continue;
//将乘积和乘数转换为字符串数组
str1 = String.valueOf(pro).split("");
str2 = (String.valueOf(i) + String.valueOf(j)).split("");
//对字符串数组进行排序
Arrays.sort(str1);
Arrays.sort(str2);
//比较两个数组
if(Arrays.equals(str1, str2)) {
sum++;
System.out.println("第"+ sum + "组吸血鬼数字:"+ i + "*"+ j
+ "="+ pro);
}
}
}
//计算程序执行的时间
System.out.println(System.currentTimeMillis()-t1);
}
}

运行程序,部分结果如下:

--------------------------------------------------------

第323组吸血鬼数字:765*963=736695

第324组吸血鬼数字:776*992=769792

**********************

第436组吸血鬼数字:981*216=211896

第437组吸血鬼数字:981*369=361989

第438组吸血鬼数字:983*65=63895

第439组吸血鬼数字:983*650=638950

第440组吸血鬼数字:984*807=794088

第441组吸血鬼数字:986*953=939658

第442组吸血鬼数字:992*776=769792

5442

---------------------------------------------

从结果中可以看出一下几个问题:

(1):第438个等式出现了伪吸血鬼数字;

(2):第324个等式和和第442个等式是一样的;

(3):程序运行的时间是5442毫秒,是不是觉得这个时间太长了呢。

这些都不是我们想要的。所以,我们需要改正程序,同时更需要优化程序。

为了解决问题(1),在判断的时候,我们可以判断a和b的长度是否相等,不等则排除。j的起始数从i开始,这样就避免了问题(2)。在排除伪吸血鬼数和减小j的循环次数后,相信第三个问题也会得到解决。从上面的问题出发,更改程序如下:

import java.util.*;
/*** 吸血鬼数字** @author Rlanffy**/
public class Vampire {public static void main(String[] args) {long t1 = System.currentTimeMillis();String[] str1, str2;int pro, sum = 0;for (int i = 10; i < 1000; i++) {for (int j = i; j < 1000; j++) {pro = i * j;int lengthi = String.valueOf(i).length();int lengthj = String.valueOf(j).length();// 排除小于1000和大于999999的数字if (pro < 1000 || pro > 999999 || lengthi != lengthj)continue;// 将乘积和乘数转换为字符串数组str1 = String.valueOf(pro).split("");str2 = (String.valueOf(i) + String.valueOf(j)).split("");// 对字符串数组进行排序Arrays.sort(str1);Arrays.sort(str2);// 比较两个数组if (Arrays.equals(str1, str2)) {sum++;System.out.println("第" + sum + "组吸血鬼数字:" + i + "*" + j+ "=" + pro);}}}// 计算程序执行的时间System.out.println(System.currentTimeMillis() - t1);}
}

运行程序,部分结果如下:

------------------------------------------------

第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

第8组吸血鬼数字:135*801=108135

**********************

第160组吸血鬼数字:891*945=841995

第161组吸血鬼数字:894*906=809964

第162组吸血鬼数字:896*926=829696

第163组吸血鬼数字:953*986=939658

2283

------------------------------------------------

从结果可以看出,从问题(1)出发,排除了乘法交换律和很多伪吸血鬼数字的结果。从问题(2)出发,减少了程序循环的次数,从而大大减少了程序的运行时间。达到了优化程序的目的。

如果大家还有更好的方法,或者觉得程序还能优化的更好的话。请多多指教哦。

本文出自 “一个风向” 博客,请务必保留此出处http://lanffy.blog.51cto.com/6452125/1308477

这篇关于java编程思想之吸血鬼数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167307

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.