我写的代码见最后,不通过,请帮忙check下啊
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a[1005],b[1005],c[1005],d[1005],e[1005];
void s2BIG(string s,int a[]){
int l=s.length();
for(int i=1;i<=l;i++)
{
a[i]=s[l-i]-'0';
}
a[0]=l;
}
void addBIG(int a[],int b[],int c[])
{
int al=a[0],bl=b[0],cl=max(al,bl);
for (int i=1;i<=cl;i++){
int t=0;
if(i<=al)
{
t+=a[i];
}
if(i<=bl)
{
t+=b[i];
}
c[i]=t;
}
for (int i=1;i<cl;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[cl]>10)
{
c[cl+1]=c[cl]/10;
c[cl]%=10;
cl++;
}
c[0]=cl;
}
void printBIG(int a[])
{
for(int i=a[0];i>=1;i--)
{
cout<<a[i];
}
}
void mulBIG(int a[],int b,int c[])
{
int al=a[0],cl=al;
long long t[1005]={};
for(int i=1;i<=cl;i++)
{
t[i]=a[i]*b;
}
for(int i=1;i<cl;i++)
{
t[i+1]+=t[i]/10;
t[i]%=10;
}
while(t[cl]>=10)
{
t[cl+1]=t[cl]/10;
t[cl]%=10;
cl++;
}
for(int i=1;i<=cl;i++)
{
c[i]=t[i];
}
c[0]=cl;
}
void divBIG(int a[],int b,int c[])
{
int al=a[0],cl=a[0];
int r;
r=0;
for(int i=cl;i>=1;i--)
{
long long t=r*10+a[i];
c[i]=t/b;
r=t%b;
}
while(cl>1&&c[cl]==0)
{
cl--;
}
c[0]=cl;
}
void subBIG(int a[],int b[],int c[])
{
int al=a[0],bl=b[0],cl=al;
for(int i=1;i<=cl;i++)
{
int t=a[i];
if(i<=bl)t-=b[i];
c[i]=t;
}
for(int i=1;i<cl;i++){
if(c[i]<0)
{
c[i+1]-=1;
c[i]+=10;
}
}
while(c[cl]==0&&cl>1)
{
cl--;
}
c[0]=cl;
}
int main() {
int n,m;
cin>>n>>m;
s2BIG("1",a);
s2BIG("1",b);
for(int i=1;i<=n;i++)
{
mulBIG(a,i,a);
}
for(int i=1;i<=m;i++)
{
divBIG(a,i,c);
mulBIG(c,i,c);
}
int tmp=n-m;
int d;
for(int i=1;i<=tmp;i++)
{
divBIG(a,i,d);
mulBIG(d,i,d);
}
mulBIG(c,d,e);
printBIG(e);
return 0;
}
#include
#include
#include
#include
#include
using namespace std;
int a[1005], b[1005], c[1005], d[1005], e[1005];
void s2BIG(string s, int a[]) {
int l = s.length();
for (int i = 1; i <= l; i++)
{
a[i] = s[l - i] - '0';
}
a[0] = l;
}
void addBIG(int a[], int b[], int c[])
{
int al = a[0], bl = b[0], cl = max(al, bl);
for (int i = 1; i <= cl; i++) {
int t = 0;
if (i <= al)
{
t += a[i];
}
if (i <= bl)
{
t += b[i];
}
c[i] = t;
}
for (int i = 1; i<cl; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
while (c[cl]>10)
{
c[cl + 1] = c[cl] / 10;
c[cl] %= 10;
cl++;
}
c[0] = cl;
}
void printBIG(int a[])
{
for (int i = a[0]; i >= 1; i--)
{
cout << a[i];
}
}
void mulBIG(int a[], int b, int c[])
{
int al = a[0], cl = al;
long t[1005] = {};
for (int i = 1; i <= cl; i++)
{
t[i] = a[i] * b;
}
for (int i = 1; i<cl; i++)
{
t[i + 1] += t[i] / 10;
t[i] %= 10;
}
while (t[cl] >= 10)
{
t[cl + 1] = t[cl] / 10;
t[cl] %= 10;
cl++;
}
for (int i = 1; i <= cl; i++)
{
c[i] = t[i];
}
c[0] = cl;
}
void divBIG(int a[], int b, int c[])
{
int al = a[0], cl = a[0];
int r;
r = 0;
for (int i = cl; i >= 1; i--)
{
long t = r * 10 + a[i];
c[i] = t / b;
r = t%b;
}
while (cl>1 && c[cl] == 0)
{
cl--;
}
c[0] = cl;
}
void subBIG(int a[], int b[], int c[])
{
int al = a[0], bl = b[0], cl = al;
for (int i = 1; i <= cl; i++)
{
int t = a[i];
if (i <= bl)t -= b[i];
c[i] = t;
}
for (int i = 1; i<cl; i++) {
if (c[i]<0)
{
c[i + 1] -= 1;
c[i] += 10;
}
}
while (c[cl] == 0 && cl>1)
{
cl--;
}
c[0] = cl;
}
int main() {
int n, m;
cin >> n >> m;
s2BIG("1", a);//a[0]=a[1]=1
s2BIG("1", b);//b[0]=b[1]=1
for (int i = 1; i <= n; i++)
{
mulBIG(a, i, a);
}
for (int i = 1; i <= m; i++)
{
divBIG(a, i, c);
mulBIG(c, i, c);
}
int tmp = n - m;
for (int i = 1; i <= tmp; i++)
{
divBIG(a, i, d);
mulBIG(d, i, d);
}
subBIG(c, d, e);
printBIG(e);
return 0;
}
头文件和你的一样
需要考虑一下边界情况,例如1和0的定义,还有就是不能硬算,会出现溢出的风险,可以按照我们平常的计算进行,千万不要套公式进行计算
// 计算组合数:使用动态规划算法
#include <iostream>
int mat[100][100];
int combinat(int m, int n) {
int i, j;
if(n == 0 || m == n)
return 1;
// // 一行一行的计算下去
// for(i = 1; i <= m; i++) { // m一般不能为0
// for(j = 0; j <= i && j <= n; j++) { // 当i大于n的时候不用计算,即不用计算n列候的数,节省时间
// if(j == 0 || j == i)
// mat[i][j] = 1;
// else
// mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
// }
// }
// 一列一列的计算下去
for(j = 0; j <= n; j++) { // 只要计算n列就行了,不用计算后面的
mat[j][j] = 1;
for(i = j+1; i <= m; i++) {
if(j == 0)
mat[i][j] = 1;
else
mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
} // 计算Cmn
}
return mat[m][n];
}
int main(int argc, const char * argv[]) {
// insert code here...
int m, n;
std::cout << "请输入组合数的m和n:";
std::cin >> m >> n;
std::cout << combinat(m, n) << std::endl;
return 0;
}