计算组合数:CSP,我写的代码见最后,不通过,请check下啊

我写的代码见最后,不通过,请帮忙check下啊

img

img

img

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