`
SavageGarden
  • 浏览: 220012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

三种语言实现36选7的全排列

阅读更多

java版

package com.swfml.test;

/**
 * 生成从m中取n个数的全排列(m > n > 0)
 * <p>思路:
 * <p>取n的数的全排列可看做数组值从(以从1到5取3个数为例)
 * <p>1, 2, 3
 * <p>变化到
 * <p>5, 4, 3
 * @author SavageGarden
 *
 */
public class Test {
	/**
	 * M值
	 */
	public static int M = 5;
	/**
	 * N值
	 */
	public static int N = 4;
	/**
	 * 记录数组(排列组合)的最小状态位
	 */
	public static int[] arrayMin = new int[N];
	/**
	 * 记录数组(排列组合)的最大状态位
	 */
	public static int[] arrayMax = new int[N];
	/**
	 * 初始化数组(排列组合)的最小状态位
	 */
	public static void initArrayMin() {
		for(int i = 0; i < N; i ++) {
			arrayMin[i] = i + 1;
		}
	}
	/**
	 * 初始化数组(排列组合)的最大状态位
	 */
	public static void initArrayMax() {
		for(int i = 0; i < N; i ++) {
			arrayMax[i] = M - i;
		}
	}
	/**
	 * 打印输出数组(排列组合)
	 * @param array
	 */
	public static void printArray(int[] array) {
		for(int i = 0; i < array.length; i ++) {
			System.out.print(array[i] + "\t");
		}
		System.out.println();
	}
	/**
	 * 判断数值在数组中(索引之前)是否存在
	 * @param array		数组
	 * @param index		索引
	 * @param value		数值
	 * @return
	 */
	public static boolean checkExit(int[] array, int index, int value) {
		for(int i = 0; i <= index; i ++) {
			if(array[i] == value) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 获取数组(排列组合)当前索引的下一个位置的值
	 * @param array
	 * @param index
	 * @return
	 */
	public static int getNextValue(int[] array, int index) {
		for(int i = 0; i < M; i ++) {
			if(!checkExit(array, index, i + 1)) {
				return i + 1;
			}
		}
		return 0;
	}
	/**
	 * 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
	 * @param array
	 * @param index
	 */
	public static int[] getNextArray(int[] array, int index) {
		int value = array[index] + 1;
		while(checkExit(array, index, value)) {
			value ++;
		}
		if(value <= M) {
			array[index] = value;
			if(index < N - 1) {
				while(index < N - 1) {
					value = getNextValue(array, index);
					index ++;
					array[index] = value;
				}
			}
			return array;

		} else {
			index--;
			if(index == -1) {
				return null;
			}
			return getNextArray(array, index);
		}
	}
	public static void getAll() {
		initArrayMin();
		initArrayMax();		

		printArray(arrayMin);
		int[] temp;
		while((temp = getNextArray(arrayMin, N - 1)) != null) {
			printArray(temp);
		}
		printArray(arrayMax);
	}
	public static void main(String args[]) {
		getAll();
	}
}

 JavaScript版

<html>
	<body>
		<div id="message"/>
	</body>
</html>
<script>
	//M值
	var M = 5;
	//N值
	var N = 3;
	//记录数组(排列组合)的最小状态位
	var arrayMin = new Array(N);
	//记录数组(排列组合)的最大状态位
	var arrayMax = new Array(N);
	var message = "<textarea cols='100' rows='50'>";
	/**
	 * 初始化数组(排列组合)的最小状态位
	 */
	function initArrayMin() {
		for(var i = 0; i < N; i ++) {
		     arrayMin[i] = i + 1;
		}	
	}
	/**
	 * 初始化数组(排列组合)的最大状态位
	 */
	function initArrayMax() {
		for(var i = 0; i < N; i ++) {
			arrayMax[i] = M - i;
		}
	}
	/**
	 * 打印输出数组(排列组合)
	 * @param array
	 */
	function printArray(array) {
		for(var i = 0; i < array.length; i ++) {
			message += array[i] + "\t";
		}
		message += "\n";
	}
	/**
	 * 判断数值在数组中(索引之前)是否存在
	 * @param array		数组
	 * @param index		索引
	 * @param value		数值
	 * @return
	 */
	function checkExit(array, index, value) {
		for(var i = 0; i <= index; i ++) {
			if(array[i] == value) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 获取数组(排列组合)当前索引的下一个位置的值
	 * @param array
	 * @param index
	 * @return
	 */
	function getNextValue(array, index) {
		for(var i = 0; i < M; i ++) {
			if(!checkExit(array, index, i + 1)) {
				return i + 1;
			}
		}
		return 0;
	}
	/**
	 * 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
	 * @param array
	 * @param index
	 */

	function getNextArray(array, index) {
		var value = array[index] + 1;
		while(checkExit(array, index, value)) {
			value ++;
		}
		if(value <= M) {
			array[index] = value;
			if(index < N - 1) {
				while(index < N - 1) {
					value = getNextValue(array, index);
					index ++;
					array[index] = value;
				}

			}
			return array;

		} else {
			index--;
			if(index == -1) {
				return null;
			}
			return getNextArray(array, index);
		}
	}

	function getAll() {
		initArrayMin();
		initArrayMax();

		printArray(arrayMin);
		var temp;
		while((temp = getNextArray(arrayMin, N - 1)) != null) {
			printArray(temp);
		}
		message += "</textarea>";
		document.getElementById("message").innerHTML = message;

	}

	getAll();

</script>

 C版

#include <stdio.h>
#define M 5
#define N 4
/* 记录数组(排列组合)的最小状态位 */
int arrayMin[N];
/* 记录数组(排列组合)的最大状态位 */
int arrayMax[N];
void initArrayMin();
void initArrayMax();
void printArray(int *array);
int checkExit(int *array, int index, int value);
int getNextValue(int *array, int index);
int *getNextArray(int *array, int index);
void getAll();
/* 初始化数组(排列组合)的最小状态位 */
void initArrayMin()
{
    int i;
    for(i = 0; i < N; i ++)
    {
        arrayMin[i]= i + 1;
    }
}
/* 初始化数组(排列组合)的最大状态位 */
void initArrayMax()
{
    int i;
    for(i = 0; i < N; i ++)
    {
        arrayMax[i] = M - i;
    }
}
/* 打印输出数组(排列组合) */
void printArray(int *array)
{
    int i;
    for(i = 0; i < N; i ++)
    {
        printf("%d\t", *(array + i));
    }
    printf("\n");
}
/* 判断数值在数组中(索引之前)是否存在 */
int checkExit(int *array, int index, int value)
{
    int i;
    for(i = 0; i <= index; i ++) {
        if(*(array + i) == value) {
            return 1;
        }
    }
    return 0;
}
/* 获取数组(排列组合)当前索引的下一个位置的值 */
int getNextValue(int *array, int index)
{
    int i;
    for(i = 0; i < M; i ++) {
        if(!checkExit(array, index, i + 1)) {
            return i + 1;
        }
    }
    return 0;
}
/* 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位 */
int *getNextArray(int *array, int index)
{
    int value = *(array + index) + 1;
    while(checkExit(array, index, value) == 1) {
        value ++;
    }
    if(value <= M) {
        *(array + index) = value;
        if(index < N - 1) {
            while(index < N - 1) {
                value = getNextValue(array, index);
                index ++;
                *(array + index) = value;
            }
        }
        return array;
    } else {
        index--;
        if(index == -1) {
            return NULL;
        }
        return getNextArray(array, index);
    }
}
void getAll()
{
    initArrayMin();
    initArrayMax();

    printArray(arrayMin);
    int *temp;
    while((temp = getNextArray(arrayMin, N - 1)) != NULL) {
        printArray(temp);
    }
}
void main()
{
    getAll();
}
0
1
分享到:
评论

相关推荐

    随机数产生与仿真36选7的开奖过程

    本主题聚焦于如何使用汇编语言来实现随机数生成,并模拟36选7彩票开奖的过程。汇编语言是一种低级编程语言,它直接对应于计算机硬件的指令集,因此对计算机系统的底层操作有直接控制能力。 首先,随机数生成的核心...

    汇编36选7期末作业

    【汇编36选7期末作业】是一个针对汇编语言学习者的实践项目,旨在加深对汇编语言的理解和应用。这个作业的核心目标是利用系统时钟生成随机数,并通过延迟技术逐步显示这些数字,模拟彩票“36选7”的过程。在汇编语言...

    36选7(取不重复7个数).e.rar

    标题中的“36选7(取不重复7个数)”是一个典型的数学问题,涉及到组合数学和概率论的概念。在彩票或抽奖等活动中,经常会出现类似的问题,即从一定数量的选项中选择一定数量的不同元素。在这个场景下,我们要从36个...

    36选7(取不重复7个数).rar

    标题中的“36选7(取不重复7个数)”是一个典型的组合数学问题,它涉及到从36个不同的元素中选择7个不重复的元素。这个问题在编程、数据分析、概率统计以及彩票游戏等领域都有应用。让我们深入探讨一下这个主题。 ...

    Python实现的彩票机选器实例

    在本篇文章中,我们将深入探讨如何利用Python语言开发一个彩票机选器,并通过具体的代码示例来展示其实现过程。此彩票机选器能够模拟双色球和大乐透两种类型的彩票号码随机生成功能。 #### 一、项目背景及目的 ...

    36选7的开奖过程,每次从1到36的数中生成一个随机数

    3. **算法实现**:一种简单的实现方式是使用一个循环,从1到36遍历,每次随机选取一个未选过的数字。但是,这种方法效率较低,因为随着已选数字的增加,未选数字的范围会变小。更好的方法是维护一个大小为36的列表,...

    36选7可执行java文件

    36选7可执行java文件,小程序,可模拟36选7抽奖。。。

    C语言36选7算法

    c语言写的访36选7彩票程序!

    VB程序体彩36选7

    一个仿真的36选7的VB程序,蛮好玩的。是简易程序的改进啊

    泛珠三角区域联网36选7电脑体育彩票游戏规则.pdf

    泛珠三角区域联网36选7电脑体育彩票游戏规则.pdf

    体育彩票36选7号码分析系统Vb源码版.rar

    体育彩票36选7号码分析系统Vb源码版,里面的排序代码主要参考了别人的代码。数组交换值,保持两个Array的对应关系,Myarray2只是跟随MyArray数组调整。功能:10个号码的出6保5型,15个号码的中7保5型,10个号码的中7保...

    用C语言程序模拟36选7

    C语言 C++ 模拟36选7的程序 用C语言程序模拟36选7

    【易语言源码】36选7(取不重复7个数).e

    【易语言源码】36选7(取不重复7个数).e

    VB6.0实现彩票36选7选号程序.rar

    VB6.0实现彩票36选7选号程序,功能:生成14个过滤条件值保存DB,查询指定期的前X期开出的个数,七期随机选号法,统计每个号码出球规律,"随机选下注数据,从选定号码中遍历组合,在选中号码列表中继续筛选等。...

    setTimeout制作36选7

    在这个场景中,“setTimeout制作36选7”指的是利用`setTimeout`来模拟一个彩票抽奖系统,其中“36选7”是一种常见的彩票玩法,玩家从36个数字中选择7个进行投注。 首先,我们来详细理解`setTimeout`的工作原理。`...

    fortran写的36选7概率分析

    【标题】"fortran写的36选7概率分析"揭示了使用FORTRAN编程语言进行彩票概率统计的主题。FORTRAN(Formula Translation)是一种早期的高级编程语言,尤其在科学计算领域广泛应用。在这里,它被用来计算中国36选7彩票...

    33选6与36选7全组合速度试验

    在本试验中,可能就是通过这两种方法之一来生成并显示所有可能的“33选6”和“36选7”组合。 然后,提到的RtlMoveMemory是一个Windows API函数,用于内存操作。它将源缓冲区的数据复制到目标缓冲区,通常用于内存块...

Global site tag (gtag.js) - Google Analytics