以下是引用wp231957在2014-4-21 11:21:36的发言:
第一个问题你有代码没 我对全排列不咋熟悉 你有现成代码最好
第二个问题不是问题
第三个问题没有办法
第一个问题你有代码没 我对全排列不咋熟悉 你有现成代码最好
第二个问题不是问题
第三个问题没有办法
我也没有代码。
只有最上面那个程序,是以1为间隔计算8模体中每种8模体出现次数的。
但这个程序无法以2、3、4、5等为间隔。
#include <stdio.h> #include <string.h> #include <stdlib.h> int count=0; /* * 加1后进位操作 * 用字符串模拟数字的进位操作 */ void add_one(int *array, int array_len, int radio, int *flow) { int i; for ( i=array_len-1; i>=0; i-- ) { array[i] += 1; //没有进位就退出 if (array[i] < radio) return; else array[i] = 0; } // 最高位溢出 - 标志进位操作已经结束 (*flow) = 1; } /* * 获取全排列 */ int get_pailie(char *set, int set_len, int sub_len, char *out, int out_len) { int end_flag = 0; int *array = NULL; int i = 0; if ( NULL==set || NULL==out || out_len<sub_len ) return -1; if ( (array=(int *)malloc(sub_len * sizeof(int))) == NULL ) return -2; // 初始化整数集合为0 for( i=0; i<sub_len; i++ ) array[i] = 0; while( 1 != end_flag ) { for(i=0; i<sub_len; i++)out[i] = set[array[i]];// 输出结果的每一位与它对应的数的每一位相同 printf("%9s", out); if(count%8==0) printf("\n"); count++; // 下标+1 add_one(array, sub_len, set_len, &end_flag); } free(array); return 0; } int main(void) { char *set="ACGT"; char out[9] = {0}; int set_len = 4; int sub_len = 8; get_pailie(set, set_len, sub_len, out, sub_len); printf("\n共有组合(含重复数据)%d组\n",count); return 0; }