编写计算组合数C(m,n)=m!(m-n)!n!的程序。要求编写线程并行计算m!,n!以及(m

编写计算组合数C(m,n)=m!(m-n)!n!的程序。要求编写线程并行计算m!,n!以及(m,第1张

#include<stdioh>

long func(long n)

{

 if(0 == n)

 {

  return 1;

 }

 return n  func(n-1);

}

int main()

{

 long m = 4, n = 2;

 long result = (func(m)/func(m-n)/func(n));

 printf("%ld\n",result);

 return 0;

}

不懂为什么要用线程,多线程还有控制线程同步,问题是根本不需要多线程。

问题太多。。。

1,第四行 double result,product,case; 中case不能作变量名,保留字。

2,第十行 result = fact(i); 函数参数太少,你下面定义的函数应该有2个参数

3,case = result / (product (n - m)!);中感叹号是什么意思?

4,。。。。。

问题太多,楼主基本功很不扎实啊!

#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;

}

Function c(ByVal m As Integer) As Long

If m = 0 Then

c = 1 ' Return 1 不是用这个返回, 直接赋值

Else

c = m c(m - 1) 'Return m c(m - 1) '同上

End If

End Function

Private Sub Button1_Click(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles Button1Click

Dim N As Integer , M As Integer , a As Integer, b As Integer

Dim x1 as long , x2 as long , x3 as long

N =val (TextBox1Text) 'N = TextBox1Text

M = val(TextBox2Text ) 'M = TextBox2Text

If N > M Then

a = N - M

x1 = c(N)

x2 = c(M)

x3 = c(a)

b = x1 / (x2 x3)

TextBox3Text = b

End If

End Sub

自己写一个:

#include

typedef

unsigned

uint;

uint

cc(uint

n,

uint

r)

{

uint

anr

=

1;

uint

arr

=

1;

for(;

r

>

0;

anr

=

n--,

arr

=

r--);

return

anr

/

arr;

}

int

main()

{

printf("%d\n",

cc(4,2));

}

我也不清楚算组合除了定义法还有什么好的算法,但有一种方法是绝对可以提升效率的,就是用空间换时间。

组合数本来就很大,全列出来的话不会很多(在你的编译器支持的范围内)。你可以把在你用的编译器支持的最大无符号整型范围内的最大组合数,以及小于这个组合数的数全列成一个散列表,用数做key,组合数做对应的value,用的时候就查找一下,这会就成o(1)了。大于编译器支持的最大无符号整型数范围的组合数既然无法被正确存储,在运行时作计算也没多大意义。

只是一个想法

以上就是关于编写计算组合数C(m,n)=m!/(m-n)!/n!的程序。要求编写线程并行计算m!,n!以及(m全部的内容,包括:编写计算组合数C(m,n)=m!/(m-n)!/n!的程序。要求编写线程并行计算m!,n!以及(m、编写程序 计算组合数的公式、c语言 排列组合 程序算法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存