排列计算器在 C++ 中不起作用

Permutation calculator isn't working in C++

美好的一天!我的排列计算器有问题。由于某种原因,最终结果始终为 1。目前我们不允许使用递归,所以我选择使用 for 循环来查找阶乘。

这是我的代码:

#include <iostream>
using namespace std;

int fact(int x);
int perm(int y, int z);
int n, r, npr;
char ch;


int main()
{

    do{

        cout<<"Enter n (object/s): ";
        cin>> n;
        cout<< "Enter r (sample/s): ";
        cin>> r;


        npr= perm(n,r);

        cout<< "Value of "<< n<<"P"<< r<< " = "<< npr<<endl;
        cout<<"Would you like to repeat this again? [y/n] \n";
        cin>> ch;
        cout<< "\n";

    } while(ch=='y');

    cout<< "Thank you and have a nice day!";

    return 0;
}


int fact(int x)
{
   int number, cum = 1;

    for(number=1;number<=n;number++)
      cum=cum*number;

    return cum;
}

int perm(int y, int z)
{

    return fact(n) / fact(n-r);
}

您的代码中的问题是不必要地滥用全局变量。这个函数:

int fact(int x) 
{
   int number, cum = 1;

    for(number=1;number<=n;number++)
      cum=cum*number;

    return cum;
}

总是计算 n 的阶乘。无论调用它时传递什么参数,因此这里:

int perm(int y, int z)
{

    return fact(n) / fact(n-r);
}

fact(n) returns n 的阶乘。 fact(n-r) returns n 的阶乘。结果总是 1。删除全局变量并使函数真正使用它们的参数:

#include <iostream>

int fact(int x);
int perm(int y, int z);


int main() {

    int n = 0;
    int r = 0;
    char ch = 'n';

    do{    
        std::cout << "Enter n (object/s): \n";
        std::cin >> n;
        std::cout << "Enter r (sample/s): \n";
        std::cin >> r;
        auto npr = perm(n,r);
        std::cout << "Value of "<< n << "P" << r << " = " << npr << "\n";
        std::cout << "Would you like to repeat this again? [y/n] \n";
        std::cin >> ch;
        std::cout << "\n";  
    } while(ch=='y');

    std::cout << "Thank you and have a nice day!";
}

int fact(int x) {
   int cum = 1;   
   for(int number=1;number<=x;number++) {
      cum=cum*number;
   }
   return cum;
}

int perm(int y, int z) {
    return fact(y) / fact(y-z);
}