VBA:求等于某值的所有组合

VBA:求等于某值的所有组合,第1张

ActiveSheetCalculate

k = 2

For a = 2 To 13

    For b = a + 1 To 14

        For c = b + 1 To 15

            For d = c + 1 To 16

            Cells(k, 4) = Cells(a, 2)

            Cells(k, 5) = Cells(b, 2)

            Cells(k, 6) = Cells(c, 2)

            Cells(k, 7) = Cells(d, 2)

            k = k + 1

            Next

        Next

    Next

Next

MsgBox ("共有" & k - 1 & "个")

随机数会变动,建议关掉自动重算,程序的开始那条是重算命令。共有1366种情况

k的值我弄错了,应该是1365,因为是从2开始的,应该-2

组合的数量,其实可以用概率论的方法。

就是C 4 15 ,15!/(4!11!)

用excel的公式可以求出

=FACT(15)/FACT(4)/FACT(11)

递归吧。

void Gofor(int l_n, int r_n, string s, int n, vector<string>& result){

// n 是括号的总数

// 如果"("的数量和")"一样, 并且")"的数量和总数一样,那么就有一个答案就出现了

if (l_n == r_n && r_n == n)     

    resultpush_back(s);                                  

// 如果"("的数量比总数小,那么加一个"("

if (l_n < n)    

    Gofor(l_n+1, r_n, s+"(", n, result);

// 如果")"的数量比"("的数量小, 那么加一个")"

if (r_n < l_n)                  

            Gofor(l_n, r_n+1, s+")", n, result);

}

vector<string> Parenthesis(int n){

// 不要在意变量名

    vector<string> result(0);

    if (n == 0) return result;

// 从一个"("开始

    string start = "(";

// 我们从一个"("开始,那么left_number = 1,right_number = 0

    int left_number = 1; 

    int right_number = 0; 

// 开始递归

    Gofor(left_number, right_number, start, n, result);

    return result;

}

void main(){

int n,r;

scanf(n,r);

int c=con(n,r);

static int a[c+1][r+1];

f(n,r);

int i,j;

for(i=1;i<=c;i++){

for(j=1;j<=r;j++){

printf(a[i][j]);

printf(’/t’);

}

printf(’/n’);

}

}

int con(int x,int y){

int m=1;int p=1;int q=1;

int i,co;

for(i=1;i<=x;i++)

m=i;

for(i=1;i<=y;i++)

p=1;

for(i=1;i<=x-y;i++)

q=i;

co=m/(pq);

return co;

}//求组合

int f(int s,int z){

int i,j,k;

int x=0;

int y;

j=1;k=0;int t;int p;

for(y=x+1;y<=s-z+1;y++){

p=k+con(s-y,z-y);

for(t=p;t<=p+k;j++)

a[t][j]=y;

if(j<=z){

j++;

f(x+1);

}

}

return a[t][j];

}

版本 2

程序集 窗口程序集1

子程序 __启动窗口_创建完毕

局部变量 A, 整数型

局部变量 B, 整数型

局部变量 C, 整数型

局部变量 D, 整数型

局部变量 数组, 文本型, , "4"

数组 = { “A”, “B”, “C”, “D” }

编辑框1是否允许多行 = 真

编辑框1内容 = “”

计次循环首 (4, A)

计次循环首 (4, B)

如果真 (B = A)

到循环尾 ()

如果真结束

计次循环首 (4, C)

如果真 (C = B 或 C = A)

到循环尾 ()

如果真结束

计次循环首 (4, D)

如果真 (取反 (D = C 或 D = B 或 D = A))

编辑框1内容 = 编辑框1内容 + 数组 [A] + 数组 [B] + 数组 [C] + 数组 [D] + “ ”

如果真结束

计次循环尾 ()

计次循环尾 ()

计次循环尾 ()

计次循环尾 ()

----------------------------------------

运行结果:

ABCD ABDC ACBD ACDB ADBC ADCB BACD BADC BCAD BCDA BDAC BDCA CABD CADB CBAD CBDA CDAB CDBA DABC DACB DBAC DBCA DCAB DCBA

这个只能用软件或者脚本来计算生成,我用过这家的软件,百度输入“号码组合/数字组合排列脚本/字母/标题所有组合生成” 关键字搜索 就可以找到该软件开发的作者网站。 各种数字号码组合生成软件都有,也可以按个人要求定制一些特殊功能,很不错,还可以提供免费试用,你可以问问看看。

#include<stdioh>

#include<stringh>

void

Show(int

n,int

len

,char

str[],

char

p[],int

i)

{

/函数功能说明: 密码穷举法

递归算法

参数说明:

len

密码可选元素的个数,实际等于

strlen(str);

n

密码位数。

STR[]密码表。

p

密码排列组合的临时存档

/

int

a;

n--;

for(a=0;

a

<

len;

a++)

{

p[n]=str[a];

if(n==0)printf("%d:%s

",(i)++,p);

if(n>0)Show(n,len

,

str,p,i);

}

} /驱动程序

用于测试/

int

main(void)

{

char

str[]="abcdef";//密码表

可选元素集合可根据选择修改

int

n=4; //密码位数,根据具体应用而定。

int

len=strlen(str);//用于密码元素集合计数。

char

p[20]; //存放排列组合的密码,用于输出。

int

num=0;//存放统计个数的整数值,

int

i=&num;//计数器

地址。

p[n]='\0';//这个不用说啦。 Show(

n,len

,str,

p

,i);

printf("\n%d

位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,i); return

0;

}

这个算法挺麻烦的,要遍历几次,可以这样做:

1)按大到小的顺序排序输入数组;

2)按个数循环找,先2个一组、再3个一组。。。。;其间注意判断:和小于20就break;等于20就print,大于20就继续;

循环挺复杂的,一下说不清,不说了。。

void

f()

{

int

i1,i2,i3,i4,i5,i6,i7,i8;

for

(i1=1;i1<32;i1++)

for

(i2=1;i2<32;i2++){if

(i1==i2)

continue;

for

(i3=1;i3<32;i3++){if

(i1==i3)

continue;

if

(i2==i3)

continue;

for

(i4=1;i4<32;i4++){if

(i1==i4)

continue;

if

(i2==i4)

continue;

if

(i3==i4)

continue;

for

(i5=1;i5<32;i5++){if

(i1==i5)

continue;

if

(i2==i5)

continue;

if

(i3==i5)

continue;

if

(i4==i5)

continue;

for

(i6=1;i6<32;i6++){if

(i1==i6)

continue;

if

(i2==i6)

continue;

if

(i3==i6)

continue;

if

(i4==i6)

continue;

if

(i5==i6)

continue;

for

(i7=1;i7<32;i7++){if

(i1==i7)

continue;

if

(i2==i7)

continue;

if

(i3==i7)

continue;

if

(i4==i7)

continue;

if

(i5==i7)

continue;

if

(i6==i7)

continue;

for

(i8=1;i8<32;i8++){if

(i1==i8)

continue;

if

(i2==i8)

continue;

if

(i3==i8)

continue;

if

(i4==i8)

continue;

if

(i5==i8)

continue;

if

(i6==i8)

continue;

if

(i7==i8)

continue;

printf("%d,%d,%d,%d,%d,%d,%d,%d\

",i1,i2,i3,i4,i5,i6,i7,i8);

}}}}}}}

}

不过估计没有什么用,因为输出的组合数多达

31302928272625/(12345678)个

没有实际意义。

以上就是关于VBA:求等于某值的所有组合全部的内容,包括:VBA:求等于某值的所有组合、如何在c++环境下编写一个能输出n对圆括号所有组合的程序、跪求用递归思想编一函数求组合数的程序。(用C哦。)比如在1,2,3,4,5中输出3个数的所有排列!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9872668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存