-=ЮрА=- написав:Думаю це можна вважати за 1 рядок коду бо саме тіло power2 - 1 умова, тобто можна і тернарником записати
#include <cmath>
#include <iostream>
using namespace std;
size_t power2(size_t n);
int main(){
cout<<pow(2.0, 5.0)<<" "<<power2(5)<<endl;
cout<<pow(2.0, 17)<<" "<<power2(17)<<endl;
return 0;
}
size_t power2(size_t n){
if( n )
return 2 << (n - 1);
else
return 1;
}
http://codepad.org/U2dOkNvB
В п'ятому завданні сказано:
Реалізувати функцію, яка визначає можливість представлення value у вигляді 2n, де value - натуральне число.
Якщо розглядати це завдання строго так, як воно написане, то воно не коректне і тому не може бути виконаним.
Я посмів припустити, що це завдання має додаткові умови (по замовчуванню):
value і n мають один із стандартних типів (ushort, uint, ulong, ...), нехай int.
Тоді задача виглядає так:
Реалізувати функцію, яка поверне true, якщо для заданого value існує n таке, що виконується умова value = 2n, і яка поверне false в іншому випадку.
В стандартних типах value = 2n в двійковій системі виглядає завжди однаково:
000...0001000...000
або
/(0*)1(0*)/
Тобто вся задача зводиться до того, щоб перевірити чи в числі встановлено (1) лише один біт (решта - 0).
І виходить, що правильна відповідь:
bool isPowerOfTwoRepresentable(unsigned int value)
{
return value && ((value - 1) & ~value) == value - 1;
}
Це я до того, що піднесення двійки в степінь - зовсім не те, що вимагається в завданні.