Есть ли лучший способ сделать это на C ? Проверьте, какие числа удовлетворяют условию [A * B * C = A! B! C!]

#c #mathematical-optimization

#c #математическая оптимизация

Вопрос:

Это то, что я придумал

 #include <iostream>
using namespace std;
int serialNumber = 1;
 

Будет ли рекурсия лучше?

 int factorial(int n)
{
    int k=1;
    for(int i=1;i<=n;  i)
    {
        k=k*i;
    }
    return k;
}
 

Как я могу сделать это в одном цикле for ?
Или это лучший способ?

 int main()
{
    int a;
    int b;
    int c;
    int fact1;
    int fact2;
    int fact3;
    for (a=1;a < 11;a  )
    {
        fact1 = factorial(a);
        for (b=1;b < 11;b  )
        {
            fact2 = factorial(b);
            for (c=1;c < 11;c  )
            {
                fact3 = factorial(c);
                cout << serialNumber << " : ";
                int LHS = fact1   fact2   fact3;
                if (LHS == a * b * c)
                {
                    cout << "Pass:" <<"    "<< a << " amp; " << b << " amp; " << c << endl;
                }
                else
                {
                    cout << "Fail" <<endl;
                }
                    serialNumber  ;
            }
            c = 1;
        }
        b = 1;
    }
    return 0;
}
 

Я вынужден добавить в него больше кода none.
Спасибо за помощь!

Комментарии:

1. Выполните факториал в цикле for вместо использования рекурсии. И, возможно, вы могли бы попытаться вычислить a, b, c, используя один цикл for, вместо того, чтобы делать это 3 раза. Я еще не полностью уверен в увеличении производительности.

2. Я немного попробовал (cpp.sh/9erjuv ), лучшим решением, по-видимому, является цикл for-loop для его вычисления. Версия «один раз» не настолько эффективна, я думаю, это было бы неплохо, но, возможно, для больших чисел.

3. Как бы я мог сделать это в одном цикле for ?

4. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что вопросы о рабочем коде лучше подходят для сайта Code Review Stack Exchange .

5. Спасибо за совет, я разместил вопрос на сайте.

Ответ №1:

Не знаю, помогает ли это, но> проверьте минимум A, B, C

 A! B! C! = (min(A,B,C)!)*(1 ((min 1..restfact1)!) ((min 1..restfact2)!))
 

Таким образом, вы можете вычислить минимальный факториал, а затем повторно использовать его для вычисления других.
С другой стороны, вы можете вычислить только максимальный факториал и сохранить его результаты в массиве и повторно использовать предварительно вычисленные значения для нахождения факториала меньших чисел

Другим следствием является то, что минимальное число может быть уменьшено

 restfact1 * restfact2 = ((min-1)!)*(1 ((min 1..restfact1)!) ((min 1..restfact2)!))
 

Ответ №2:

Часть вопроса заключалась в том, как это можно сделать за один цикл, и это один из способов сделать это.

Я не думаю, что это лучший способ сделать это, но вопрос был задан:

     constexpr int bound = 10;
    int Factorials[bound   1];
    for (int i = 1; i <= bound;   i) Factorials[i] = Factorial(i);

    for (int i = 0; i < bound * bound * bound;   i) {
        int s = i   1;
        int a = i;
        int c = 1   a % bound;
        a /= bound;
        int b = 1   a % bound;
        a /= bound;
          a;

        cout << s << " : ";
        int LHS = Factorials[a]   Factorials[b]   Factorials[c];
        if (LHS == a * b * c)
            ...
    }