`
jitabc
  • 浏览: 47283 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

吸血鬼数字算法研究

阅读更多
所谓“吸血鬼数字”就是指位数为偶数的数字(我们算得是4位的),可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列。以两个0截尾的数字是不允许的。例如:1260=21*60          1827=21*87          2187=27*81
今天在Thinking in JAVA 中做到的练习题。我先自己写了一个算法,但是总感觉太复杂。后来在网上找到一个比较好的算法。如下:
package org.idcn.jse; 

public class XiXieGui { 
    /** 
     * 吸血鬼数字算法 
     * 如:12*60=1260 
     * YangL. 
     */ 
    public static void main(String[] args) { 
        String[] ar_str1, ar_str2; 
        int sum = 0; 
        for (int i = 10; i < 100; i++) { 
            for (int j = i + 1; j < 100; j++) { 
                int i_val = i * j; 
                if (i_val < 1000 || i_val > 9999) 
                    continue; // 积小于1000或大于9999排除,继续下一轮环 
                ar_str1 = String.valueOf(i_val).split(""); 
                ar_str2 = (String.valueOf(i) + String.valueOf(j)).split(""); 
                java.util.Arrays.sort(ar_str1); 
                java.util.Arrays.sort(ar_str2); 
                if (java.util.Arrays.equals(ar_str1, ar_str2)) { 
                    // 排序后比较,为真则找到一组 
                    sum++; 
                    System.out.println("第" + sum + "组: " + i + "*" + j + "=" 
                            + i_val); 
                } 
            } 
        } 
        System.out.println("共找到" + sum + "组吸血鬼数"); 
    } 
}

这个算法应该是比较简单的了。算法中用到String.valueOf(j)).split("");的方法来把数字转换为字符串,以拆分数字的方法用的很巧妙了。把数字的比较,转换为对字符串的比较,实在高明。

下面是我在《Thinking in Java, 2nd edition, Annotated Solution Guide Revision 1.0》中找到的答案,也就是Thinking in JAVA的官方答案书上的答案。不过个人感觉没有上面的算法好。
//: c03:E11_Vampire.java
// Solution by Dan Forhan
import java.applet.*;
import java.awt.*;

public class Vampire extends Applet {
    private int num1, num2, product;
    private int[] startDigit = new int[4];
    private int[] productDigit = new int[4];
    private int count = 0;
    private int vampCount = 0;
    private int x, y;
    public void paint(Graphics g) {
      g.drawString("Vampire Numbers", 10, 20);
      g.drawLine(10, 22, 150, 22);
      // Positioning for output to applet:
      int column = 10, row = 35;
      for(num1 = 10; num1 <= 99; num1++)
        for(num2 = 10; num2 <= 99; num2++) {
          product = num1 * num2;
          startDigit[0] = num1 / 10;
          startDigit[1] = num1 % 10;
          startDigit[2] = num2 / 10;
          startDigit[3] = num2 % 10;
          productDigit[0] = product / 1000;
          productDigit[1] = (product % 1000) / 100;
          productDigit[2] = product % 1000 % 100/10;
          productDigit[3] = product % 1000 % 100%10;
          count = 0;
          for(x = 0; x < 4; x++)
            for(y = 0; y < 4; y++) {
              if (productDigit[x] == startDigit[y]){
                count++;
                productDigit[x] = -1;
                startDigit[y] = -2;
                if (count == 4) {
                  vampCount++;
                  int a = (int)Math.random() * 100;
                  int b = (int)Math.random() * 100;
                  int c = (int)Math.random() * 100;
                  if (vampCount < 10) {
                    g.drawString("Vampire number     "
                      + vampCount + " is " + num1 +
                      " * " + num2 + " = "+ product,
                      column, row);
                    row += 20;
                  } else {
                    g.drawString("Vampire number    "
                      + vampCount + " is " + num1 +
                      " * " + num2 + " = "+ product,
                      column, row);
                    row += 20;
                  }
                }
              }
            }
        }
    }
} ///:~



来自我的搜狐博客:http://ielin.blog.sohu.com/63617803.html
刚从搜狐把博客搬过来,以后就在这安家了。
分享到:
评论
6 楼 patrickyao1988 2009-11-03  
第一个命名比较山寨。。。。
5 楼 hand515 2009-11-03  
import java.util.*;

public class Test{
    public static void main(String[] args){
	int[] st=new int[4];
	int[] ed=new int[4];
        for(int i=11;i<100;i++){
		for(int j=(1000/i+1<i?i:1000/i+1);j<100;j++){
			int s=i*j;
			boolean b=true;
			st[0]=i%10;
			st[1]=i/10;
			st[2]=j%10;
			st[3]=j/10;
			ed[0]=s%10;
			ed[1]=(s/10)%10;
			ed[2]=(s/100)%10;
			ed[3]=s/1000;
			Arrays.sort(st);
			Arrays.sort(ed);
			for(int k=0;k<4;k++){
				if(st[k]!=ed[k]){
					b=false;
					break;
				}
			}			
			if(b) System.out.println(i*j+"="+i+"*"+j);
		}
	}
    }
}


我觉得这样比较好,乘法交换律和两个数相乘必须大于1000这两个条件可以少判断一些东西。
4 楼 ningmenglovesoft 2009-09-20  
哎?看了半天眼都看花了。找了半天都不知道你的变量是怎么弄的。。
3 楼 colinzhy 2009-09-20  
我自己也写了个,不过更麻烦,谢谢指教了!
2 楼 jitabc 2008-11-09  
axxxx2000 写道

XiXieGui 怎么不学学下面的命名方法

正在苦学英语中,谢谢您的提醒.
1 楼 axxxx2000 2008-11-09  
XiXieGui
怎么不学学下面的命名方法
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    4位吸血鬼数字

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

    1-10000吸血鬼数字

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

    Java实现吸血鬼数字

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

    JAVA吸血鬼数字算法

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

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

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

    JAVA求吸血鬼数字

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

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

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

    吸血鬼数字

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

    吸血鬼算法

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

    1-10000中的吸血鬼数组合

    在IT领域,"吸血鬼数组合"是一个有趣的数学概念,尤其在计算机编程和算法设计中常常被用作练习或挑战。标题“1-10000中的吸血鬼数组合”指的是寻找1到10000之间满足特定条件的数对,这些数对被称为“吸血鬼数”。在...

    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...

    吸血鬼骑士占卜游戏。

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

    Flash吸血鬼破解版

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

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

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

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

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

    swf吸血鬼 进程提取工具

    总的来说,“SWF吸血鬼”进程提取工具是一个强大且实用的工具,它简化了从运行进程中提取SWF文件的过程,对于开发者、安全研究员以及对Flash内容感兴趣的用户来说,都是不可或缺的工具之一。了解其工作原理和使用...

    java 吸血鬼程序

    java 吸血鬼程序 学习java必须要学习的经典案例,加油学习把

Global site tag (gtag.js) - Google Analytics