`

吸血鬼数字 高效算法

阅读更多
提前声明. 此算法来自 【老紫竹】.
老紫竹CSDN ID:java2000_net
主页http://www.laozizhu.com
废话不多说.直接上代码
package com.javaeye.arrick.util;
import java.util.Arrays;   
/**  
 * 吸血鬼数字,高效率版本.<br>  
 * 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。<br>  
 * 比如 1395 =15 * 93  
 *   
 * @author 老紫竹(laozizhu.com)  
 */  
public class VampireNumber {   
  public static void main(String[] arg) {   
    String[] ar_str1, ar_str2;   
    int sum = 0;   
    int from;   
    int to;   
    int i_val;   
    int count = 0;   
    // 双重循环穷举   
    for (int i = 10; i < 100; i++) {   
      // j=i+1避免重复   
      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;   
        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);   
  }   
}  

运行结果
第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

count 次数只有232.. 已经算是最高效的了.
而主要的高效代码 只有3行代码
if (i_val % 100 == 0 ||(i_val - i - j) % 9 != 0) {   
  continue;   
}   

而已
i_val % 100 -->都明白什么意思.
(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整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。
完毕.
《Thinking in Java》 (Dan Forhan推荐练习代码)
分享到:
评论
13 楼 yingwuhahahaha 2010-03-15  
zhanghaocool 写道
345678910 写道
假设
i_val = 1000a + 100b + 10c + d,
因为满足i_val = x * y,
则有x = 10a + b, y = 10c + d

i_val = 1000a + 100b + 10c + d,
i_val = x * y,
x = 10a + b,
y = 10c + d
这些都是条件,并不是推导出来的 "则有x = 10a + b, y = 10c + d " (wrong)


i_val = 1000a + 100b + 10c + d,
如果有吸血鬼数字 i_val ,则有x,y使得下面成立
i_val = x * y,
x = 10a + b
y = 10c + d
或者其它情况如
x = 10a + b
y = 10d + c

无论何种情况,相同项(如a)的系数都是10的m次方-10n次方,都是9的倍数。
楼主有点没说明白


正解。我看楼主的“假设。。则有。。”还在觉得奇怪,这个在数学上是用什么导出来的。
12 楼 zhanghaocool 2010-03-14  
345678910 写道
假设
i_val = 1000a + 100b + 10c + d,
因为满足i_val = x * y,
则有x = 10a + b, y = 10c + d

i_val = 1000a + 100b + 10c + d,
i_val = x * y,
x = 10a + b,
y = 10c + d
这些都是条件,并不是推导出来的 "则有x = 10a + b, y = 10c + d " (wrong)


i_val = 1000a + 100b + 10c + d,
如果有吸血鬼数字 i_val ,则有x,y使得下面成立
i_val = x * y,
x = 10a + b
y = 10c + d
或者其它情况如
x = 10a + b
y = 10d + c

无论何种情况,相同项(如a)的系数都是10的m次方-10n次方,都是9的倍数。
楼主有点没说明白
11 楼 laoshifu 2010-03-14  
345678910 写道
楼主的解法没有体现出数学思路,再好好想想。

同意LS,这式子推理简直荒谬。
10 楼 zhanghaocool 2010-03-13  
banfry 写道
ar_str1 = String.valueOf(i_val).split("");     
不理解,split不指定参考字符串,出来的结果是什么呢?


一个一个单“字符”串(这里字符不同于char)
9 楼 banfry 2010-03-13  
ar_str1 = String.valueOf(i_val).split("");     
不理解,split不指定参考字符串,出来的结果是什么呢?
8 楼 zhanghaocool 2010-03-13  
用string数组不可能高效,改成int数组,时间消耗大概只有原来的1/9


package com.kwzh;

import java.util.Arrays;

public class VampireNumber {

	public static void main(String[] args) {
		float f = System.nanoTime();
		new VampireNumber().vampireArray();
		System.out.println("string array: " + (System.nanoTime() - f)
				+ " nano seconds");
		f = System.nanoTime();
		new VampireNumber().vampireArray2();
		System.out.println("int array: " + (System.nanoTime() - f)
				+ " nano seconds");
	}

	public void vampireArray() {
		int small, big, product, floor = 10, ceil = 100;
		int from, count = 0, sum = 0;
		String[] ar_str1, ar_str2;
		for (small = floor; small < ceil; small++) {
			from = Math.max(1000 / small, small + 1);
			for (big = from; big < ceil; big++) {
				product = small * big;
				if (product % 100 == 0 || (product - small - big) % 9 != 0) {
					continue;
				}
				ar_str1 = String.valueOf(product).split("");
				ar_str2 = (String.valueOf(small) + String.valueOf(big))
						.split("");
				Arrays.sort(ar_str1);
				Arrays.sort(ar_str2);

				if (Arrays.equals(ar_str1, ar_str2)) {
					// 排序后比较,为真则找到一组
					// 返回两个Objects数组彼此相等,返回true
					sum++;
					System.out.println("第" + sum + "组: " + small + "*" + big
							+ "=" + product);
				}
				count++;
			}
		}
		System.out.println(count);
	}

	public void vampireArray2() {
		int small, big, product, floor = 10, ceil = 100;
		int from, count = 0, sum = 0;
		int[] ar_int1 = new int[4], ar_int2 = new int[4];
		for (small = floor; small < ceil; small++) {
			from = Math.max(1000 / small, small + 1);
			for (big = from; big < ceil; big++) {
				product = small * big;
				if (product % 100 == 0 || (product - small - big) % 9 != 0) {
					continue;
				}
				ar_int1[0] = small / 10;
				ar_int1[1] = small % 10;
				ar_int1[2] = big / 10;
				ar_int1[3] = big % 10;
				ar_int2[0] = product / 1000;
				product = product % 1000;
				ar_int2[1] = product / 100;
				product = product % 100;
				ar_int2[2] = product / 10;
				ar_int2[3] = product % 10;
				Arrays.sort(ar_int1);
				Arrays.sort(ar_int2);
				if (Arrays.equals(ar_int1, ar_int2)) {
					sum++;
					System.out.println("第" + sum + "组: " + small + "*" + big
							+ "=" + product);
				}
				count++;
			}
		}
		System.out.println(count);
	}

}

7 楼 zhanghaocool 2010-03-12  
东四环屠夫 写道
吸血鬼数字更高效版本 …… 屠夫版:
http://butcher.iteye.com/blog/613750

呃,我的是检验而非穷举 ……


感觉两个二位数字穷举,比检验四位数更高效

AsWater 写道
to = Math.min(10000 / i, 100);   //返回两个int值中较小的一个 
for (int j = from; j < to; j++) {  
  ......
}

直接写 for (int j=from; j<100; j++) 就可以了。因为i的取值是从10到100,所以10000/i肯定是大于等于100的。


恩,to不需要
6 楼 AsWater 2010-03-12  
to = Math.min(10000 / i, 100);   //返回两个int值中较小的一个 
for (int j = from; j < to; j++) {  
  ......
}

直接写 for (int j=from; j<100; j++) 就可以了。因为i的取值是从10到100,所以10000/i肯定是大于等于100的。
5 楼 jackdong 2010-03-12  
东四环屠夫 写道
吸血鬼数字更高效版本 …… 屠夫版:
http://butcher.iteye.com/blog/613750

呃,我的是检验而非穷举 ……


写的不错 ,但是仔细看了一下 检验的算法也这差不多的思路 应该不会更高效率 只是ruby api的强大 看起来更简洁
4 楼 Darrick 2010-03-12  
vieri122 写道
最好能说一下解题的思路

  回头补上吧.
3 楼 Darrick 2010-03-12  
东四环屠夫 写道
吸血鬼数字更高效版本 …… 屠夫版:
http://butcher.iteye.com/blog/613750

呃,我的是检验而非穷举 ……

Ruby. 不会. 嘿嘿.
2 楼 vieri122 2010-03-12  
最好能说一下解题的思路
1 楼 东四环屠夫 2010-03-12  
吸血鬼数字更高效版本 …… 屠夫版:
http://butcher.iteye.com/blog/613750

呃,我的是检验而非穷举 ……

相关推荐

    4位吸血鬼数字

    在编程领域,"吸血鬼数字"是一种特殊的数字类型,这个概念源于数学,后被引入到编程挑战中,成为一种有趣的算法问题。4位吸血鬼数字是指由四个不同的数字组成,可以分解成两个两位数的乘积,这两个两位数的各位数字...

    1-10000吸血鬼数字

    ### 吸血鬼数字的理解与计算 #### 一、什么是吸血鬼数字? 吸血鬼数字(Vampire number)是一种有趣的数学概念,属于娱乐数学的一部分。一个标准的n位数称为一个n阶吸血鬼数字,如果它可以表示为两个n/2位数相乘的...

    Java实现吸血鬼数字

    在这个问题中,我们将探讨如何使用Java编程语言来实现找到所有四位吸血鬼数字的方法,并比较三种不同的算法效率。 首先,我们可以采用暴力枚举法,遍历所有四位数并检查它们是否为吸血鬼数字。这种方法是最直观的,...

    c语言 吸血鬼数字简单源码

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

    JAVA求吸血鬼数字

    吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以2个0结尾的数字是不允许的,例如,下列数字都是吸血鬼数字: 1260 ...

    JAVA吸血鬼数字算法

    THINK IN JAVA上的课后题,只是寻找4位数的。

    Save The Vampire 拯救吸血鬼 - Unity建造吸血鬼城堡逃脱游戏项目源码C#

    Save The Vampire 拯救吸血鬼 - Unity建造吸血鬼城堡逃脱游戏项目源码C# 支持Unity版本2019.427f1及以上 概述 拯救吸血鬼是一款大胆的游戏,你以疯狂的速度在城堡的路径上奔跑,通过选择路径图案来建造最大的城堡...

    吸血鬼数字

    吸血鬼数字的三种实现方法,及其运行速度。最后一种绝对的好方法。java编程吸血鬼数字答案。

    吸血鬼算法

    吸血鬼算法是指一种特殊的算法,它可以将一个数字分解成两个相同长度的数字乘积。这种算法通常用于解决某些特殊的数学问题。 在给定的代码中,我们可以看到作者使用Java语言编写了一个吸血鬼算法。该算法的主要思想...

    1-10000中的吸血鬼数组合

    在IT领域,"吸血鬼数组合"是一个有趣的数学概念,尤其在计算机编程和算法设计中常常被用作练习...此外,这个话题还可以激发对数字性质、位运算以及高效算法设计的兴趣,对于提升编程思维和问题解决能力都有一定的帮助。

    flash吸血鬼2.4破解版.zip

    用鼠标点击左边的定位器不要松手,然后移动到目标窗口,松手,FLASh吸血鬼将对目标进行搜索,为你找出所有可用的FLASHFlash吸血鬼2.4是在2.3版的基础上优化了搜索技术,实现了更快的搜索速度,经过测试,目标进程中...

    swf吸血鬼 专门下载网页中的flash文件

    **SWF吸血鬼:专业下载网页Flash文件的利器** 在互联网早期,Flash技术曾广泛应用于网站设计,尤其是动画和游戏领域。为了便于用户离线欣赏这些内容,开发者们创造了一系列工具,其中“SWF吸血鬼”就是一款专注于...

    C++中华吸血鬼新的代码

    中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar中华吸血鬼新的代码.rar...

    吸血鬼骑士占卜游戏。

    标题中的“吸血鬼骑士占卜游戏”表明这是一个与热门动漫《吸血鬼骑士》相关的游戏,而游戏的形式则是占卜。占卜游戏通常是指通过某种随机或预先设定的规则来预测或揭示未知信息,这类游戏往往具有娱乐性和趣味性,...

    Survivor.IO 源码 类吸血鬼幸存者项目

    《Survivor.IO》是一款以吸血鬼幸存者为主题的独立游戏,其源码为我们提供了深入理解游戏开发过程和实现机制的机会。在这个项目中,开发者并未包含与“dots”相关的部分,这可能意味着游戏的核心逻辑、画面渲染或者...

    Flash吸血鬼破解版

    Flash吸血鬼是一个用于吸取Flash的工具,它可以帮助您从应用程序或者浏览器中获得受保护的Flash。  不论您想得到的Flash采用何种方式保护,Flash吸血鬼都能轻松的把它吸出来,您只需用Flash吸血鬼的定位器锁定需要...

    Flash吸血鬼(无水印版)zhxin.rar

    《Flash吸血鬼》是一款专为处理Adobe Flash文件而设计的工具,尤其在去除水印方面表现出色。这款软件以其高效、便捷和无需安装的特点深受用户喜爱。在提供的压缩包"Flash吸血鬼(无水印版)zhxin.rar"中,包含的主要...

    中华吸血鬼----传说中的源码

    3. **算法和数据结构**:源码中的函数和方法往往包含了一系列的算法,通过对这些算法的理解,我们可以学习到如何高效地处理数据和解决问题。 4. **编程风格和规范**:源码反映了开发者的编程习惯和团队的编码规范,...

Global site tag (gtag.js) - Google Analytics