2016年12月20日 星期二

(1A2B遊戲)手把手教你如何光源氏計畫培養電腦成為你的1A2B遊戲伴侶 Part2.5 重複數字檢查 12/20補充

這篇只是簡單的提示如何檢查陣列裡面像是1155這種4位數字有重複數字給0
1023正常數字給1
這邊為了方便起見,所以
只列印出101~200中間重複數字給0 不重複給1
本篇目標就是101~200陣列給0或給1
成功答案結果為

兩個函數功能
Dismantling(拆數字)
Comparison(比對)
判別會是 ex:
box1[110]=0 box1[133]=0 <==重複
box1[120]=1 box1[123]=1 <==不重複

在這邊先給大家看陣列若沒給值 預設都是0.....
示意圖1~100(程式碼如下)


import java.util.*;
public class Arraysamenum
{
 static int i=0,j=0,x=0,y=0,z=0;
 static int[] box1=new int[101];
 public static void main (String args[])
 {
  for(i=1;i<=100;i++)
  {
   System.out.print("box1["+i+"]="+box1[i]+" ");
   if(i%10==0)
   {

    System.out.println("");
   }


  }
 }

}
-------------------------------------Dismantling---------------------

public static void Dismantling(int x)
 {
  int i=0;
  for(i=0;i<=2;i++)
  {
   switch(i)
   {
    case 0:
    y=x/100;
    box2[i]=y;
    break;
    case 1:
    z=(x-(y*100))/10;
    box2[i]=z;
    break;
    case 2:
    a=(x-(y*100)-(z*10));
    box2[i]=a;
    break;

   }
    
  }
 }

以上為拆解數字 先前解釋過了 這邊不贅述
-----------------------Comparison----------------------
接下來 我們就來把值拆掉放到另外一個陣列box2 去做比對動作....(一樣拆數字)
示意圖如下 可以發現我把前一個值跟後一個值抓出來做比對 是一個巢狀迴圈




i=0的時候 j=i+1; j永遠是下一個數字 這樣跑過一次 如果我發現有重複數字
box2[i]==box2[j]的時候 我就把ck存成1 ck=1 沒有重複數字就存0 做完迴圈後回傳ck值 判別ck值就知道有沒有重複了


提示容易寫錯重點:因為這是個迴圈 若我在第0個跟第1個對有重複
但第1個數字跟第2個數字沒有重複
如果你寫成.....
for(i=0;i<=1;i++)
{
   for(j=i+1;j<=2;j++)
   {

     if(box2[i]==box2[j])
     {
       ck=1;//重複

     }
     else
     {

      ck=0;//沒重複

     }

   }
   return ck;//廻傳ck
}
那麼....就算第0個跟第1個數字有重複 最終ck值還是"0" 因為第1個和第2個不符合 所以ck又被覆蓋掉了對吧?所以我們應該....如果有重複ck=1 那麼之後就直接跳出迴圈
是不是我只要在else 給0之前做個判斷呢?
if(ck==1)break; 所以我只要拿到值ck==1那麼我就直接跳出 就不給0
所以程式碼就是....
public static int Comparison(int[] box2)
 {
  int i=0,j=0;
  for(i=0;i<=1;i++)
  {
   for(j=i+1;j<=2;j++)
   {
    if(box2[i]==box2[j])
    {
     ck=1;
    }
    else
    {
     if(ck==1)break;
     ck=0;
    }

   }
  }
  return ck;
 }


------------------------做完拆解數字跟比對之後我們把功能融合起來---------------------------------
做完這邊之後......呼應本篇的要求 要把101~200陣列弄出來對吧?
所以呢 是不是就會寫成for(i=101;i<=201;i++){執行要的程式}?

-----------------------------------以下為執行要的程式內容---------------------------------------------
好~該要的功能都有了 拆解數字跟比對
所以拆解數字我放一個函數Dismantling 比對我放另外一個函數Comparison
Dismantling(i)//拆解並存給box2[]
Comparison(int[] box2)//box2的比對 回傳ck值 (1有重複 0沒重複)
接下來判斷
if(ck==1)
{
  box1[i]=0
  ck=0;//注意!box[i]給完0之後 ck要回復成0 否則 後面都是1.....

}
else
{
box1[i]=1;
ck=0;

}
接下來就列印 不解釋了......
附上完整程式碼...




import java.util.*;
public class Arraysamenum
{
 static int x=0,y=0,z=0,a=0,ck=0,ak=0;
 static int[] box1=new int[201];
 static int[] box2=new int[3];
 public static void main (String args[])
 {
  int i=0;

  for(i=101;i<=200;i++)
  {
   Dismantling(i);
   Comparison(box2);
   if(ck==1)
   {
    box1[i]=0;
    ck=0;
   }
   else
   {
    box1[i]=1;
    ck=0;
   }
   
   System.out.print("box1["+i+"]="+box1[i]+" ");
   if(i%10==0)
   {

    System.out.println("");
   }


  }
  
 }
 public static void Dismantling(int x)
 {
  int i=0;
  for(i=0;i<=2;i++)
  {
   switch(i)
   {
    case 0:
    y=x/100;
    box2[i]=y;
    break;
    case 1:
    z=(x-(y*100))/10;
    box2[i]=z;
    break;
    case 2:
    a=(x-(y*100)-(z*10));
    box2[i]=a;
    break;

   }
    
  }
 }
 public static int Comparison(int[] box2)
 {
  int i=0,j=0;
  for(i=0;i<=1;i++)
  {
   for(j=i+1;j<=2;j++)
   {
    if(box2[i]==box2[j])
    {
     ck=1;
    }
    else
    {
     if(ck==1)break;
     ck=0;
    }

   }
  }
  return ck;
 }

}

沒有留言:

張貼留言