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();
}
分享到:
相关推荐
随机数产生与仿真36选7的开奖过程 (汇编语言程序设计)
36选7(取不重复7个数).e.rar
这是汇编36选7的期末作业,功能特色:就是利用系统时钟产生随机数,并且利用延时来逐渐显示数字。
36选7可执行java文件,小程序,可模拟36选7抽奖。。。
c语言写的访36选7彩票程序!
主要介绍了Python实现彩票机选器的方法,可以模拟彩票号码的随机生成功能,需要的朋友可以参考下
一个仿真的36选7的VB程序,蛮好玩的。是简易程序的改进啊
36选7(取不重复7个数).rar
该程序实现36选7的开奖过程,每次从1到36的数中生成一个随机数,并且要使1到36中的每一个数被取到的概率完全相等。循环进行7次,同时要保证每个都不相同且不为0.
泛珠三角区域联网36选7电脑体育彩票游戏规则.pdf
setTimeout制作36选7 setTimeout制作36选7 setTimeout制作36选7 setTimeout制作36选7
体育彩票36选7号码分析系统Vb源码版,里面的排序代码主要参考了别人的代码。数组交换值,保持两个Array的对应关系,Myarray2只是跟随MyArray数组调整。功能:10个号码的出6保5型,15个号码的中7保5型,10个号码的中7保...
C语言 C++ 模拟36选7的程序 用C语言程序模拟36选7
【易语言源码】36选7(取不重复7个数).e
VB6.0实现彩票36选7选号程序,功能:生成14个过滤条件值保存DB,查询指定期的前X期开出的个数,七期随机选号法,统计每个号码出球规律,"随机选下注数据,从选定号码中遍历组合,在选中号码列表中继续筛选等。...
C语言编程,与你分享
组合M选N,全组合36选7,全组合33选6,RtlMoveMemory,显示结果