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

例如,下列数字都是吸血鬼数字

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

写一个程序,找出所有4位的吸血鬼数字*

void test(){

int count = 0,num=0;

int from,to,val;

for(int i=10;i<100;i++) {

from = Math.max(1000/i, i+1);//就是i*j>=1000的意思,在i已知的情况下,j的最小值基本已经确定,从这个值开始内循环比较高效。

to = Math.min(10000/i, 100);

for(int j=from;j

val = i*j;

if(val%100==0 || (val-i-j)%9!=0) continue;

count++;

char[] cval = String.valueOf(val).toCharArray();

char[] ij = (String.valueOf(i)+String.valueOf(j)).toCharArray();

Arrays.sort(cval);

Arrays.sort(ij);

if(Arrays.equals(cval,ij)){

num++;

System.out.print("第"+num+"组吸血鬼数字:");

System.out.println(i+"*"+j+"="+val);

}

}

}

System.out.println("总共比较"+count+"次");

}

}

关于算法的解释,来自网友MT502

假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x = 10a + b, y = 10c + d

则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。

所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。

我准许做一下

x*y = val = 1000a + 100b + 10c + d;

我们假设

x = 10a + b, y = 10c + d

x*y-x-y

= val - x-y

= (1000a + 100b + 10c + d) - (10a+b) - (10c +d) = 990a + 99b + 9c

= 9 * (110a + 11b + c);

对于别的组合可能性,结果一样,比如

x=10c+a; y=10d+b;

x*y-x-y

= val - x-y

= (1000a + 100b + 10c + d) - (10c+a) - (10d +b) = 999a + 99b -9d

= 9 * (110a + 11b -d);

当然也能被9整除了

java吸血鬼数字_吸血鬼数字(java)相关推荐

  1. java吸血鬼数字_吸血鬼数字的简单实现

    从think in java上面看到的吸血鬼数字,自己写了一个简单的实现 package com.zyl; import java.util.ArrayList; import java.util.A ...

  2. java求幸运数字_幸运数字问题 —— Java实现

    题目描述 小雅同学认为6,8是她的幸运数字,而其他数字均不是,一个幸运数是指在十进制表示下只含有幸运数字的数.给定你一个区间(a,b)a和b之间(其中包括a和b幸)运数的个数. 输入描述 输入两个整数 ...

  3. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  4. java datetime 转换_如何实现Java日期时间格式转换

    Java日期时间以及日期相互转换 Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseExcept ...

  5. A002、java环境搭建_第一个java程序

    目录 1.内容介绍 2.软件开发概述 2.1 软件开发概念 2.2 软件开发示例 2.3 软件开发语言 2.3.1 计算机语言概述 2.3.2 计算机语言分类 2.4 小结 3.Java概述 3.1 ...

  6. java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量

    cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...

  7. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  8. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  9. java for循环_愉快地学Java语言:第五章 循环

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  10. java 内存空间_怎样用java实现存储空间动态分配

    1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续4)
  2. Hibernate 所有缓存机制详解
  3. PHP生成PDF并转换成图片爬过的坑
  4. Maven安装和配置及使用方法
  5. cuda、cudnn相关问题链接
  6. leetcode面试题 04.03. 特定深度节点链表(bfs)
  7. Data-Mediator入门系列4----常用类说明
  8. 企业实战|CentOS8安装Zabbix 4.4
  9. Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
  10. 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
  11. 利用ExcelJS读取Excel文件
  12. 【光学】基于matlab圆孔菲涅尔衍射【含Matlab源码 522期】
  13. android9手机* 代码,android Telephony学习 --- 第九篇 USSD简介
  14. 如何轻松清除Google搜索记录
  15. NC 一些常用方法总结
  16. Android 100元平板也能吃鸡玩王者!小米平板刷机神盾dot1.2保姆级教程。
  17. ESP32数据存储 nvs
  18. Redis4.0、5.0、6.0、7.0特性整理(持续更新)
  19. 学习笔记-主成分分析法
  20. mysql记录历史价格_mysql历史订单

热门文章

  1. 微信小程序和微信H5有什么区别?
  2. malloc()动态分配内存
  3. 微信小程序开发--组织通讯录
  4. 一篇讲给自己听的k8s网络模型
  5. 世界上最经典的25句话[转载]
  6. 歌礼与先声签订利托那韦片供应协议;索迪斯华东物流新仓于上海松江区开业 | 美通企业日报...
  7. 在移动硬盘中安装win10和macos双系统
  8. 2021年黄石二中高考成绩查询,黄石二中2019高考喜报成绩、一本二本上线人数情况...
  9. VUE React Angular
  10. 百度地图SDK无法定位到当前所在位置;一直显示天安门