求排列组合的代码 算不了n=m的情况

#include<iostream>
using namespace std;
int sum=1;
int jiecheng(int n,int out){
    if(n==0) return 0;
    out*=sum++;
    if(sum==n+1) return out;
    jiecheng(n,out);
}
int main(){
    int n,out=1,m,N,M,NM,A,C;
    cout<<"输入n,m的值:"<<endl;
    while(cin>>n>>m) {
    N=jiecheng(n,out);
    out=1;
    sum=1;
    if(n-m==0){
        NM=jiecheng(1,out);
    }
    else{
        NM=jiecheng((n-m),out);
    }
    A=N/NM;
    out=1;
    sum=1;
    M=jiecheng(m,out);
    out=1;
    sum=1;
    C=A/M;
    cout<<"选择你进行的操作:按1求排列;按2求组合:"<<endl;
    int xuanze;
    cin>>xuanze;
    if(xuanze==1){
        cout<<"共有"<<A<<"种排列方式"<<endl;
    } 
    else if(xuanze==2){
        cout<<"共有"<<C<<"种组合方式"<<endl;
    } 
    cout<<endl;
    cout<<endl;
    cout<<"输入n,m的值:"<<endl;
    }
    return 0;
}

有帮助望采纳,谢谢!

#include <iostream>
#include <cstdio>
using namespace std;
double C(int n,int m) //通过递归求解组合C(n,m)的值
{
    if(m==0||m==n)
        return 1;
    else
        return C(n-1,m)+C(n-1,m-1);
}
double A(int n,int m) //通过递归求解排列A(n,m)的值
{
    if(m==1)
        return n;
    else
        return n*A(n-1,m-1);
}
int main()
{
    int n=0,m=0;
    cout<<"输入n,m(保证n>=m):";
    cin>>n>>m;
    if(n<m)
        cout<<"输入有误!"<<endl;
    else
    {
        printf("排列:A(n,m)=%.0lf\n",A(n,m));
        printf("组合:C(n,m)=%.0lf\n",C(n,m));
    }
    return 0;
}