Thinking in Java--吸血鬼数字

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

写一个程序求出4位数字中的所有吸血鬼数字.

其实就是一个简单的dfs.我们可以将原数字的各位提取出来,然后在去填充新的两个数.如果可以得到两个新数的乘积恰好为原数,则这个数字是吸血鬼数字.下面的代码中IsVampire类提供判断一个数字是否是吸血鬼数的功能,如果是的话,返回其中的一个新数,否则返回-1;

代码如下:

package lkl;

public class Main {

     public static void main(String[] args){

             IsVampire im = new IsVampire();
             for(int i=1000;i<=9999;i++){
                int t=im.check(i);
                if(t!=-1){
                     System.out.println(i+"是吸血鬼数字 "+i+"="+t+"*"+i/t);
             }
         }
     }
}
package lkl;
import java.util.*;

public class IsVampire {

     private int num,x;
     private int[] a=new int[4];
     private int[] vis=new int[4];

     public void dfs(int cur,int t1,int t2) {
         if(num!=-1) return ;
         if(cur==4){
              if(t1*t2==x)
              {
                  num=t1;
              }
              return;
         }
        for(int i=0;i<4;i++){
             if(cur==0&&a[i]==0)
                   continue;
             if(cur==2&&a[i]==0)
                    continue;
             if(vis[i]==1) continue;
             vis[i]=1;
             if(cur<=1)
                 dfs(cur+1,t1*10+a[i],t2);
             if(cur>=2)
                 dfs(cur+1,t1,t2*10+a[i]);
             vis[i]=0;
             if(num!=-1) return ;
        }
     }

     public void Init(int x){
         num=-1; this.x=x;
         ///java中没有C++中的memsest函数,可以调用Arrays中的fill函数
         ///统一填充初值,但是因为java不能直接操作内存,这种方法实际上还是
         ///堆数组进行逐个填充
          Arrays.fill(a, 0);
          for(int i=0;i<4;i++){
              a[i]=x%10;
              x/=10;
          }
     }
     public int check(int xx){
            Init(xx);
            dfs(0,0,0);
            return num;
     }
}
时间: 2024-10-20 11:14:23

Thinking in Java--吸血鬼数字的相关文章

Java - 吸血鬼数字

吸血鬼数字是指位数是偶数的数字, 由一对相乘的数字得到, 而且每个数字包含乘积一半位数的数字. 如: 1092: 12*91 1207: 17*71 1250: 25*50 1260: 21*60 1275: 17*75 1278: 18*71 1325: 25*53 找出4位数的所有吸血鬼数字. //: Main.java import java.util.ArrayList; /** * 吸血鬼数字 */ class Main { public static boolean vampire(

java吸血鬼数字

很惭愧(其实没什么惭愧,水平就这样),搞了半晌才写出来了一个求四位吸血鬼数字的方法 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. 以两个0结尾的数字是不允许的,例如,下列数字都是"吸血鬼"数字: 1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81 int len = 4; // 求出四位值得范围 int max = (int) (Math.pow(10,

Thinking In Java 里面吸血鬼数字题

首先解释一下吸血鬼数字:吸血鬼数字是指位数为偶数的数字,可由一对数字相乘而得到,这对数字各包含乘积的一半位数的数字,以两个0结尾的数字是不允许的. 四位数吸血鬼数字示例:1260=21*60,1827=21*87,2187=27*81-- 先列出结果:一共7个:1260=21*60,1395=15*93,1435=41*35,1530=51*30,1827=87*21,2187=27*81,6880=86*80 方法一: 本方法是<Thinking in Java>的官方答案,由于所处章节很靠

【Java】 Thinking in Java 4.8 练习10 吸血鬼数字

题目: 吸血鬼数字是指位数为偶数的数字,可以有一对数字相乘得到,而这对数字各包含成绩的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.  以两个0结尾的数字是不允许的.写一个程序,找出4位数中所有吸血鬼数字. 方法一: 1 public static void main(String[] args) { 2 outer: for (int i = 10; i <= 99; i++) { 3 for (int j = i + 1; j <= 99; j++) { 4 int sum =

《Thinking in Java》习题——吸血鬼数字

最近在看<Java编程思想>,这本书非常棒,不愧是Java程序员的圣经.看到第四章,后面有道题目很有意思,于是就自己做了做. 1. 我的思路很简单,但是算法效率非常之低.就是把4位数拆成4个数字,比如1260--->1,2,6,0.然后4位数字组合成两个2位数,计算它们 的乘积,相等则就是吸血鬼数字. 1 public class Test2 { 2 /* 3 * 将4位数拆分成4个数 4 * */ 5 public int [] array(int num){ 6 int [] a =

Java编程思想——吸血鬼数字问题

吸血鬼数字:我最开始想的是把四位数拆开,然后进行自由组合然后相乘,最后比较得到结果,在网上去看了一些朋友的做法,让我大吃一惊啊,想到自己的算法也要好好看了 ,这样子下去是不行滴 现贴出代码: package edu.cqu.main; import java.util.Arrays; /** * 问题描述: * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 例如: * 1260 = 21 *

Java 找出四位数的全部吸血鬼数字 基础代码实例

/** * 找出四位数的全部吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,能够由一对数字相乘而得到,而这对数字各包括乘积的一半位数的数字,当中从最初的数字中选取的数字能够随意排序. * 以两个0结尾的数字是不同意的. *   比例如以下列数字都是吸血鬼数字 1260=21*60 1827=21*87 2187=27*81 ... * 比較笨的低效率的做法: 遍历全部四位数, 每生成一个四位数的时候, *         在双重循环遍历两位数,在两位数的内层循环中推断是否与最外层循环的四位数相等

【Java编程思想 - 练习】吸血鬼数字

Thinking in Java 这个程序我自己敲出来的代码,用的方法很笨的感觉,将就着吧,目前没时间想那么多,得继续学啊. 1 class Vnum{ 2 public static void main(String args[]){ 3 CheckVampire cVampire = new CheckVampire(); 4 for(int i=1000;i<10000;i++){ 5 if(cVampire.isVampire(i)){ 6 System.out.println(i);

《java编程思想》读后笔记:二,吸血鬼数字

书本p75中一道读后练习思考题,题目如下: 吸血鬼数字是指位数为偶数的数字,可以有一对数字相乘得到,而这对数字各包含成绩的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.一两个0结尾的数字是不允许的,例如,下列数字都是"吸血鬼数字": 1260=21*60,1827=21*87,2187=27*81 写一个程序,找出4位数的所有吸血鬼数字. 个人代码: public static void main(String[] args) { Map<String,String&

【Java】求所有四位吸血鬼数字

1 package com.xt.homework.tools; 2 /** 3 * 4 * 7. 题目 5 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到, 6 * 而这对数字的位数是原数字的一半位数,并且由组成原数字的各个位数组成, 7 * 以两个0结尾的数字不是吸血鬼数字. 8 * 例如:1260 = 21 * 60 1827 = 21 * 87 2187= 27 * 81 9 * 求所有四位吸血鬼数字 10 * 11 * @author 天耀二期 12 * 杨勃隆 13 */