Регистрация
9 Июл 2013
Сообщения
81
Репутация
-3
Спасибо
0
Монет
0
Подскажите пожалуйста как можно оптимизировать код или где можно почитать на эту тему?

Задание:
Степень
Время: 300ms, Память: 128MB, Сложность: 25% Для натуральных чисел A и B требуется вычислить значение A^B

Входной поток в первой строке содержит числа A и B, разделенные пробелом. (1 <= A <= 9, 1 <= B <= 104)

В выходной поток выведите одно число – результат возведения в степень, без лидирующих нулей.

#include
using namespace std;
int main()
{
int m[1000] = {0}, a, b, i, k, ost = 0, zoro, d = 2;
cin >> a >> b;

m[0] = a;
for(i = 1; i < b; i++)
{
for(k = 0; k <= 1000; k++)
{
m[k] = m[k] * a + ost;
ost = m[k] / 10;
m[k] %= 10;
d++;
}
}
/*подвожу к степени*/

for(i = 1000; i >= 0; i--)
{
if(m != 0)
{
zoro = i;
break;
}
}

/*вычисляю лидирующие нули*/

for(i = zoro; i >= 0; i--)
{
cout << m;
}
/*вывожу массив*/
}
 
Если хочешь упороться по оптимизации и стилю кода почитай Meyers "Эффективное использование С++" ""Эффективный и современный C++"
 
using namespace std; int main() { size_t Result = 1, a, b; cin >> a >> b; cin.get(); if(a < 1 && a > 9){return 0;} if(b < 1 && b > 104){return 0;} for(unsigned short i(0); i < b; i++){ Result *= a; } cout << "a^b = " << a << "^" << b << " = " << Result << flush; cin.get(); return 0; } P/S/ учитывая размер чисел, вам понадобится все это делать либо с типом double либо воспользоваться большими числами))) так что тип Result будет даубл а в данной строке вставляем приведение : Result *= (double)a;. Ну и собственно все должно работать.
 
long long p=1, s=A; for(long b=B; b>0; b>>1) { // сдвиг можно заменить на деление if(b&1) p*=s; // результат s*=s; // A в целой степени двойки } // "p" просто напечатать
 
Назад
Сверху