C++ 组合数

用C++编组合数

#include <iostream>

using namespace std;

int main()

{
long int t;

cin>>t;

for(int i=0;i<t;i++)

{

long int m,n;

cin>>n;

cin>>m;

long int s=1;

long int w=1;

for(int I=0; I<n; I++)

{w=w*m;

m--;

}

for(int a=0, b=n; a<n; a++)

{s=s*b;

b=b-1;

}

cout<< w/s<<endl;

}

return 0;

}

运行也没发现什么问题
漏洞出在哪里?

如果你用这个水平编ACM的话,估计百分之九十数开小了,因为竞赛里面经常是大数,至少long,有时还需自定义char aa[1000];
还有一点,你的w/s是什么型函数?int?double?最好定义一下
先int k = w/s ;
cout << k << endl ;
这样子好多了。还有就是几种特殊情况你没有罗列出来。比如m>n ,n=0等
还有一点,第二个循环你不用那样浪费时间
直接for ( int i = 1 ; i <= n ; i++)
s = s*i ;
又或者直接定义long s = n ;
while ( n --) {
s = s* n;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-12
可能是m,n的输入没有限定,也有可能是m,n过大,导致结果溢出
第2个回答  2009-11-12
没问题吧?!如果要说有漏洞,那m不能=0,n不能大于m。。。
第3个回答  2009-11-12
语法没有问题,但不知道打算做什么。可能是和目的有出入吧。

c++为什么用C表示组合数?
C(n,m) 表示n选m的组合数,其中n是下标 , m是上标 (C上面m,下面n)。nCk是一个整体,是n个元素中,取k个元素的取法的个数,也叫n个元素中,取k 个k组合数,(C代表组合),算法是:nCk=n!\/k!(n-k)!=n(n-1)……(n-k+1)\/k!等于从n开始连续递减的m个自然数的积除以从1...

c++组合怎么算?
C(6,2)=(6*5)\/(2!) ,C(6,3)=(6*5*4)\/(3!)。C(n,m)={n*(n-1)...*(n-m+1)}\/(m!)

在C++中怎么编出求组合数的代码?且保证结果不溢出。
目前来说有三种方法可以做到算组合数,第一种是先算出两个数的阶乘,之后再算组合数,但是很容易溢出。第二种是通过组合数公式进行递归计算,但是时间复杂度大,也会容易溢出。第三种是我个人比较推荐也自己在用的,就是杨辉三角形法,使用一个二维数组来表示杨辉三角形,然后将数组里面的值计算出来保...

C语言问题:概率问题, C++怎么算?
3!×(5-3)!=3!×2!=(3×2×1)×(2×1)=12。故:C(5,3)=10。意思是从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合;从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。简介 n!

求C++全排列算法,包括000,111...999
这个我认为不是很难.可以使用3重循环实现.for(i=0;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++)cout<<i<<j<<k<<endl;这样应该就可以了.如果想知道共有多少个数,可以在后面加一个记数语句.

如何用C++实现从m个数当中选n个组合
int a[100];\/\/a[0]舍弃不用,a[1]至a[m]存组合数 void zh(int n,int m,int num){ int i;if(m==num-1){ for(i=1;i<=m;i++)printf("%d ",a[i]);printf("\\n");return;} for(i=a[num-1]+1;i<n+1;i++)\/\/有顺序的排列即为组合 { a[num]=i;\/\/printf("a[...

C\/C++语言 从33个数中选6个排列组合
组合:从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合,例如OR = {1,2,3,4}, n = 4, r = 3则无重组合为:{1,2,3}; {1,2,4}; {1,3,4}; {2,3,4}.include <stdio.h> include <stdlib.h> include <iostream.h> in...

n个数中取m个数有多少种取法C++?
如果你想用C++代码来实现这个计算,可以参考以下代码 :include <iostream> using namespace std;\/\/计算阶乘 long long factorial(int n){ long long result = 1;for(int i = 1; i <= n; i++){ result *= i;} return result;} \/\/计算组合数 long long combination(int n, int m){ ...

跪求一个C++的组合数函数next_combination
如果n个物品用于组合,在一个组合中,第i个物品有0和1两个情况,0表示不在组合中,1表示在组合中。这个组合可以表示为n位二进制数。考虑到每个物品都可能取0和1,这就是一个连续的二进制数。你所说的next_combination函数是让一个组合对应的二进制数加一,直到n位二进制数全为1为止。

如何理解大C和大C++?
第五行中的大C表示组合数Combination,组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。计算公式: ;C(n,...

相似回答