Мне нужна помощь. Я хочу вычислитьИкс заданное действительное значение а и положительное значение целое число х.
Моя программа:
#include <iostream>
using namespace std;
int main()
{
int a, x;
cout << "Input a: ";
cin >> a;
cout << "Input x: ";
cin >> x;
for (int i=0; i<=x; i++)
a= a*a;
cout << "The answer is: " << a;
}
Взгляните на этот цикл:
for (int i=0; i<=x; i++)
a= a*a;
cout << "The answer is: " << a;
}
Каждый раз, когда вы проходите этот цикл, вы умножаете a на себя. Давайте предположим, что пользователь вводит число а0. Затем:
Например, если a = 2 и x = 4, значения будут 2, 4, 16 и 256, что намного больше, чем вы хотите.
Чтобы это исправить, попробуйте изменить цикл так, чтобы у вас была вторичная переменная, изначально установленная в 1, чтобы вы продолжали умножать на a. Таким образом, вы не меняете значение, на которое вы умножаете на каждой итерации.
Далее, обратите внимание, что ваш цикл выполняется слишком много раз. Поскольку вы выполняете цикл до x и включительно, ваш цикл выполняется x + 1 раз, так что если вы хотите вычислитьИкс вы получите неправильное значение. Попробуйте изменить это на цикл ровно x раз.
Наконец, оператор print выполняется на каждой итерации, поэтому вы увидите все промежуточные значения. Измените код так, чтобы оператор print находился вне цикла.
Сделав все это, посмотрите вверх pow
функция. Если это для назначения, вы не сможете использовать эту функцию, но это самый простой способ решить эту проблему.
Надеюсь это поможет!
Есть пара ошибок:
for (int i=0; i<=x; i++)
это будет цикл для x+1
раз, а не то, что вы хотели.
a= a*a;
каждый раз, когда вы делаете это, a
это значение, которое уже умножено, поэтому вам нужна другая переменная для хранения результата.
int result = 1;
for (int i=0; i<x; i++)
result *= a;
}
cout << "The answer is: " << result;
Последнее замечание для расчета a^x
, int
может быть слишком маленьким для многих практических случаев, рассмотрим больший тип как long long
,
int result = 1;
for (int i=1; i<=x; i++)
{
result= result*a;
}
cout << "The answer is: " << result;
}
Надеюсь, что это будет работать для вас
Более «забавный» метод — использовать шаблон:
template<unsigned int E>
unsigned int power(unsigned int i)
{
return i * power<E - 1>(i); // template "loop"}
template<>
unsigned int power<0>(unsigned int i) // break the "loop"{
return 1;
}
Чтобы получить результат:
unsigned int result = power<5>(3);
Я думал, что это очевидно, но только для пояснения: этот метод требует, чтобы вы знали показатель степени во время компиляции.
поскольку std::pow
существует, немного глупо использовать цикл, но это можно сделать:
unsigned int base = SOME_BASE;
unsigned int exponent = SOME_EXPONENT;
unsigned int result = 1;
for (int i = 0; i < exponent; result *= base, ++i);