1. 程式人生 > >三重循環實現四位的吸血鬼數

三重循環實現四位的吸血鬼數

判斷 inner pub 結果 [0 bre println 重復 pri

題目:吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中抽取的數字可以任意排序。以兩個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相等時,會出現重復,所以一次計算後就跳轉到標簽位置
              }
            }
          }
        }
      }
    }
  }

}

運行結果:

技術分享

三重循環實現四位的吸血鬼數