程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java算法完成猜測雙色球中獎號碼

java算法完成猜測雙色球中獎號碼

編輯:關於JAVA

java算法完成猜測雙色球中獎號碼。本站提示廣大學習愛好者:(java算法完成猜測雙色球中獎號碼)文章只能為提供參考,不一定能成為您想要的結果。以下是java算法完成猜測雙色球中獎號碼正文


雙色球選號規矩紅球是1~33選6個,藍球1~16選1個。
它有17721088種分列組合,
這個代碼完成了若何將一組雙色球號碼 轉換成第n個分列組合數字,
和若何依據第n個分列組合數字生成一組雙色球號碼。

剖析一下本年的中獎號碼所隱含的分列組合序號,或許你會找到紀律,
哈哈,也許你能用它算出下一次的中獎號碼,趕緊嘗嘗吧!

DoubleColorBall.java

import java.util.Arrays;
 
public class DoubleColorBall {
  /**
   * 依據雙色球生成相對序號(道理:分列組合算法)
   * a b c d e f 是紅球由小到年夜 g是藍球
   */
  public static final int getBallIndex(int a,int b,int c,int d,int e,int f,int g){
    return (comp(33,6)-comp(34-a,6)+comp(33-a,5)-comp(34-b,5)
        +comp(33-b,4)-comp(34-c,4)+comp(33-c,3)-comp(34-d,3)
        +comp(33-d,2)-comp(34-e,2)+comp(33-e,1)-comp(33-f,1))*16+g;
  }
  /**
   * 依據相對序號生成雙色球(道理:遍歷一切組合)
   * a b c d e f 是紅球由小到年夜
   */
  public static final String getBall(long ballIndex){
    if(ballIndex>17721088)ballIndex=ballIndex%17721088;
    int redIndex=(int) (ballIndex/16);
    int count=0;
    for(int a=1;a<29;a++)
    for(int b=a+1;b<30;b++)
    for(int c=b+1;c<31;c++)
    for(int d=c+1;d<32;d++)
    for(int e=d+1;e<33;e++)
    for(int f=e+1;f<34;f++){//最多輪回1107568次,即為紅球組合數
      count++;
      if(redIndex==count){
        return Arrays.toString(new int[]{a,b,c,d,e,f,1+((int)ballIndex-1)%16});
      }
    }
    return null;
  }
  /**
   * 盤算組合數C(m,n)
   */
  public static final int comp(int m, int n)
  {
    int sum=1;
    for(int i=m;i>m-n;i--)sum=sum*i;
    for(int i=n;i>1;i--)sum=sum/i;
    return sum;
  }
  public static void main(String[] args) {
    //11月29日開獎成果對應序號:
    System.out.println(getBallIndex(6,20,28,29,30,31,12));//12964124
    System.out.println(getBall(12964124));//[6, 20, 28, 29, 30, 31, 12]
    //12月1日開獎成果對應序號:
    System.out.println(getBallIndex(3,8,19,25,27,28,2));//7353378
    System.out.println(getBall(7353378));//[3, 8, 19, 25, 27, 28, 2]
    //12月3日開獎成果對應序號:
    System.out.println(getBallIndex(13,17,19,20,22,25,11));//17009451
    System.out.println(getBall(17009451));//[13, 17, 19, 20, 22, 25, 11]
    System.out.println("猜測下次開獎號碼,趕緊去買吧!");
    System.out.println(getBall(System.nanoTime()));
  }
}

別的附上java雙色球復式號碼,分列組合出一切單注號碼

public class Test {

	/**
	* 雙色球復式組合
	* @param redBall	紅球數組
	* @param blueBall	籃球數組
	* @return	發生的組合個數
	*/
	public static int getDoubleChromosphere(Integer [] redBall,int [] blueBall){
		
		int count = 0;//發生的組合個數
		
		List<Integer> result = new LinkedList<Integer>();;//發生的雙色球組合
		
		//外層輪回掌握籃球
		for(int i = 0;i < blueBall.length;i++){
			
			//掌握紅球
			List<Integer> redList = new LinkedList<Integer>();
			for(Integer j : redBall){
				redList.add(j);
			}
			List<Integer> orign = new LinkedList<Integer>();
			orign.addAll(redList);
			
			for(int k = 0;k < redList.size();k++){
				redList.remove(k);
				result = redList;
				
				//最初籃球的賦值
				result.add(blueBall[i]);
				
				//輸入組合成果
				System.out.print("紅球為:\t");
				for(int j = 0;j < result.size();j++){
					if(6 == j){
						System.out.println("籃球為:\t"+result.get(j));
						break ;
					}
					System.out.print(result.get(j)+"\t");
				}
				System.out.println();
				
				//清空redLisr,從新賦值
				redList.clear();
				redList.addAll(orign);
				
				//組合數加一
				count++;
			}
		}
		return count;
	}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved