C++ 组合数
来源:百度知道 编辑:UC知道 时间:2024/05/06 21:59:25
用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;
}
运行也没发现什么问题
漏洞出在哪里?
#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;
}
没问题吧?!如果要说有漏洞,那m不能=0,n不能大于m。。。
可能是m,n的输入没有限定,也有可能是m,n过大,导致结果溢出
语法没有问题,但不知道打算做什么。可能是和目的有出入吧。