从(0,0)位置出发,到(n,m)处,只能往右或下移动,输出几种走法。为什么输入9,6的时候不对呢

#include<stdio.h>

int main()
{
    int n,m;
    
    scanf("%d %d",&n,&m);
    
    int min;
    if(n>m){
        
        int min=m;
    }else min=n;
    
    long long sum=1;
    int i=m+n;
    int q=min;
    
    while(q>0){
        
        sum*=i;
        
        q--;
        i--;
    }
    
    long long c=1;
    
    for(int j=1;j<=min;j++){
        
        c*=j;
    }
    printf("%lld\n",sum/c);
    return 0;
}



#include<stdio.h>
int a[110];
int* solve(int* s,int n,int m)
{
    int i,k;
    for(i=m,k=0;i<n,k<n-m;i++,k++)
        a[k]=s[i];
    for(i=0,k=n-m;i<m,k<n;i++,k++)
        a[k]=s[i];
    return a;
}
int main(void)
    {
        int i,n,m,s[110];
        int* ans;
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&s[i]);
        ans=solve(s,n,m);
        for(i=0;i<n;i++)
        {
            if(i==0)
                printf("%d",*(ans+i));
            else
                printf(" %d",*(ans+i));
        }
        return 0;

【以下回答由 GPT 生成】

首先,我们来看一下给定的代码。该代码使用了组合数学中的排列组合的知识,通过计算从起始点到目标点的路径数量。代码中使用了两个循环,一个是while循环用来求阶乘的分子部分,另一个是for循环用来求阶乘的分母部分。然后将两部分相除得到最终结果。

然而,给定的代码中存在一个问题。在if-else语句中,声明了一个局部变量min,并没有赋值给外部的min变量。这导致了在后续的代码中使用的min变量是未初始化的,所以计算结果是错误的。

为了修复这个问题,我们需要修改代码如下:

#include<stdio.h>

int main()
{
    int n, m;

    scanf("%d %d", &n, &m);

    int min;
    if (n > m){
        min = m;
    }else{
        min = n;
    }

    long long sum = 1;
    int i = m + n;
    int q = min;

    while (q > 0){
        sum *= i;
        q--;
        i--;
    }

    long long c = 1;

    for (int j = 1; j <= min; j++){
        c *= j;
    }
    printf("%lld\n", sum/c);
    return 0;
}

这样,我们修正了代码中的错误,保证了min变量被正确赋值。现在我们可以测试一下使用输入9和6时的结果是否正确。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这就是排列组合了