Есть ли лучший способ сделать это в C ++? Проверьте, какие числа удовлетворяют условию [A * B * C = A! + Б! + C!] - PullRequest
0 голосов
/ 14 апреля 2019

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

#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 << " & " << b << " & " << c << endl;
                }
                else
                {
                    cout << "Fail" <<endl;
                }
                    serialNumber++;
            }
            c = 1;
        }
        b = 1;
    }
    return 0;
}

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

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

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

    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)
            ...
    }
0 голосов
/ 14 апреля 2019

Не знаю, помогает ли это, но> проверить на минимум 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)!))
...