#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)
...
}