標籤:java 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; }}
Thinking in Java--吸血鬼數字