三重循環實現四位的吸血鬼數
題目:吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中抽取的數字可以任意排序。以兩個0結尾的數字是不允許的。例如下列的數字都是"吸血鬼"數字:
1260=21*60
1827=21*87
2187=27*81
寫一個程序,找出四位數的所有吸血鬼數。
思路:將四位數按位拆分為四個數字,由這四個數字組合成兩個兩位數,判斷這兩個數的乘積是否等於原四位數。
組合:1.兩個數字之間是無序的,即21*60和60*21是等價的
2.十位和個位的數字是有序的,即12和21是不同的
循環:1.外循環:固定一個數字作為十位數,其余三個數字循環作為個位數
2.內循環:以剩下的三個數循環,排除已被選中的數,再計算出兩個數的乘積;將第一個數的個位和十位轉換位置再計算判斷
偽代碼:
四位數的吸血鬼數字:
for(i從1000循環到9999取四位數){
取這個四位數的個、十、百、千位上的數字存放到數組a;
if(個位和十位的數字都為0){
停止執行當前叠代,退回到循環起始處,開始下一次循環;
}
for(j從1到3循環){
for(k從1到3循環){
if(k不等於j){
從數組中取出相應的兩位數字,計算乘積;
if(乘積等於四位數i){
打印吸血鬼數;
}
將這個兩位數的個位和十位轉換位置,計算乘積;
if(乘積等於四位數i){
打印吸血鬼數;
}
}
}
}
}
java代碼:
package operator;
public class VimpireFigures {
public static void main(String[] args) {
System.out.println("四位數的吸血鬼數:");
int p1,p2,p;
int a[]=new int[4];
inner: //跳轉標簽
for(int i=1000;i<10000;i++){
a[0]=i%10;
a[1]=i/10%10;
a[2]=i/100%10;
a[3]=i/1000%10;
if(a[1]==0&&a[0]==0){
continue;
}
for(int j=1;j<4;j++){
for(int k=1;k<4;k++){
if(k!=j){
p1=a[0]*10+a[j]; //以a[0]為固定數字
p2=a[k]*10+a[6-k-j-0];
p=p1*p2;
if(p==i){
System.out.print(a[3]+" "+a[2]+" "+a[1]+" "+a[0]+" ");
System.out.print(p1+"*"+p2+"=");
System.out.println(i);
}
p1=a[j]*10+a[0]; //個位和十位交換位置
p=p1*p2;
if(p==i){
System.out.print(a[3]+" "+a[2]+" "+a[1]+" "+a[0]+" ");
System.out.print(p1+"*"+p2+"=");
System.out.println(i);
if(a[k]==a[j]){
break inner; //當k和j相等時,會出現重復,所以一次計算後就跳轉到標簽位置
}
}
}
}
}
}
}
}
運行結果:
三重循環實現四位的吸血鬼數