吸血鬼数字算法

来源:互联网 发布:阿里云 腾讯云 aws 编辑:程序博客网 时间:2024/05/29 14:31

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

今天看thinking in java,觉得这个算法挺有意思,解读一下,呼呼

package com.shan.thinkinginjava.c4.practice;


import java.util.Arrays;
// control/VampireNumbers.java
// TIJ4 Chapter Control, Exercise 10, page 154
/* A vampire number has an even number of digits and is formed by multiplying a
 * pair of numbers containing half the number of digits of the result. The
 * digits are taken from the original number in any order. Pairs of trailing
 * zeroes are not allowed. Examples include: 1260 = 21 * 60, 1827 = 21 * 87,
 * 2187 = 27  * 81. Write a program that finds all the 4-digit vampire numbers.
 * (Suggested by Dan Forhan.)
 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
 * 
 */


public class VampireNumber10 {
public static void main(String[] arg) {
String[] ar_str1, ar_str2;
int sum = 0;
int from;
int to;
int i_val;
int count = 0;
// 双重循环穷举 ,首先应该是两个两位数相乘,所以其中的一个数字从10开始,到99结束,这是第一重循环
for (int i = 10; i < 100; i++) {
// j=i+1避免重复 因为 1000<i*j<10000,我们可以求出j的取值范围
from = Math.max(1000 / i, i + 1); // 返回两个int值中较大的一个
to = Math.min(10000 / i, 100); // 返回两个int值中较小的一个
for (int j = from; j < to; j++) {
i_val = i * j; // 下面就需要判断这个数是不是吸血鬼数了呢。
// 这一步很关键,很多人看不懂
/**
* 1、在此分析,首先吸血鬼数一定不能被100整除,不然无法摘录出来两个两位数昂。
* 2、对于(i_val-i-j)%9!=0,我们可以这样分析 设i_val = 1000a+100b+10c+d
* 因为满足i_val = x * y, 则有x = 10a + b, y = 10c + d 
* 则i_val - x - y= 990a + 99b + 9c = 9 * (110a + 11b + c) 所以i_val - x -y能被9整除。
*/
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
count++;
ar_str1 = String.valueOf(i_val).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)) {
// 排序后比较,为真则找到一组
// 返回两个Objects数组彼此相等,返回true
sum++;
System.out.println("第" + sum + "组: " + i + "*" + j + "="
+ i_val);
}
}
}
System.out.println("共找到" + sum + "组吸血鬼数");
System.out.println(count);
}
}


0 0
原创粉丝点击