15. Дано число. Определить, является ли оно целой степенью 2. (Microsoft и другие)
// is the value power of two?int _tmain(int argc, _TCHAR* argv[])
{
unsigned long int value = 0, rest, startValue;
std::cout<<"Is the value power of two? Input value : "<<std::endl;
do
{
std::cin>>value;
startValue = value;
rest = 0;
if(startValue == 2 || startValue == 1)
{
value = 0;
}
if(startValue == 0 )
{
value = 0;
rest = 1;
}
while(value)
{
rest = value % 2;
value /= 2;
if (value == 2 || rest ==1 )
{
break;
}
}
if (rest == 0)
std::cout<<"The value "<<startValue << " is a power of two"<<std::endl;
else
std::cout<<"The value "<<startValue << " is Not a power of two"<<std::endl;
}while(true);
return 0;
}
Здравствуйте, Багер, Вы писали:
Б>Насчёт задачки про два выключателя на одну лампочку. Б>Решение, использующееся у меня на даче — один обыкновенный переключатель, один двойной. Б>Есть другие решения?
Избавиться нафиг от проводов и заменить выключатели на мышей, прибитых к стенке. При клике по любой кнопки мыши программа посылает соответствующий пакет по WiFi — его ловит комп управляющий лампой и меняет состояние лампы не противоположное.
Здравствуйте, phys, Вы писали:
P>Здравствуйте, phys, Вы писали:
P>15. Дано число. Определить, является ли оно целой степенью 2. (Microsoft и другие)
много кода поскипано.....
ЖЕСТЬ!!!!
а может проще так:
bool isPowerOfTwo( int v ){ return (!(v & (v - 1)) && v); }
ЗЫ: анек в тему
задача определить является ли число V четным.
ответ:
1.программер форм на VB — (SELECT PARITY FROM ALLINTERGERS WHERE VALUE=V)
2.начинающий программер(индус) V%2==0
3.нормальный программер — !(V&1)
_JoKe_ wrote:
> bool isPowerOfTwo( int v ){ return (!(v & (v — 1)) && v); }
> ЗЫ: анек в тему > задача определить является ли число V четным. > ответ: > 1.программер форм на VB — (SELECT PARITY FROM ALLINTERGERS WHERE VALUE=V) > 2.начинающий программер(индус) V%2==0 > 3.нормальный программер — !(V&1)
А я придумал перебором:
индус без обид — оцени твоей функции надо столько итераций сколько бит в числе, при этом есть условные переходы, которые могут конвеер сбросить
к тому же ошибка в цикле надо писать не i << 1 а i<<=1
моей меньше 10 тактов которые никогда не вызывают перегруз процессорного конвеера
Здравствуйте, _JoKe_, Вы писали:
_JK>Здравствуйте, phys, Вы писали:
P>>Здравствуйте, phys, Вы писали:
P>>15. Дано число. Определить, является ли оно целой степенью 2. (Microsoft и другие) _JK>много кода поскипано..... _JK>ЖЕСТЬ!!!!
_JK>а может проще так: _JK>
_JK>bool isPowerOfTwo( int v ){ return (!(v & (v - 1)) && v); }
_JK>
Здравствуйте, Аноним, Вы писали:
А>_JoKe_ wrote:
>> bool isPowerOfTwo( int v ){ return (!(v & (v — 1)) && v); }
>> ЗЫ: анек в тему >> задача определить является ли число V четным. >> ответ: >> 1.программер форм на VB — (SELECT PARITY FROM ALLINTERGERS WHERE VALUE=V) >> 2.начинающий программер(индус) V%2==0 >> 3.нормальный программер — !(V&1) А>А я придумал перебором: А>
Здравствуйте, phys, Вы писали:
P>Здравствуйте, _JoKe_, Вы писали:
_JK>>Здравствуйте, phys, Вы писали:
P>>>Здравствуйте, phys, Вы писали:
P>>>15. Дано число. Определить, является ли оно целой степенью 2. (Microsoft и другие) _JK>>много кода поскипано..... _JK>>ЖЕСТЬ!!!!
_JK>>а может проще так: _JK>>
_JK>>bool isPowerOfTwo( int v ){ return (!(v & (v - 1)) && v); }
_JK>>
P>это не работает ....
я ошибся — работает видимо я на уровне начинающего индуса , но я почему то по этому поводу не переживаю
phys wrote: > P>>>15. Дано число. Определить, является ли оно целой степенью 2. > (Microsoft и другие) > _JK>>много кода поскипано..... > _JK>>ЖЕСТЬ!!!! > > > _JK>>а может проще так: > _JK>> > > _JK>>bool isPowerOfTwo( int v ){ return (!(v & (v — 1)) && v); } > _JK>> > > > > P>это не работает .... > > я ошибся — работает видимо я на уровне начинающего индуса , но я почему > то по этому поводу не переживаю
А я думал, Вам законно не понравилась сигнатура — при такой сигнатуре и
таком условии задачи то, что код может не работать на -MAX_INT-1, не
очень приятно.
>2a. Два игрока играют по очереди называют число, достоинство воображаемой разменной монеты. При этом нужно, чтобы это число нельзя было выплатить при помощи ранее называнных монет. Проигрывает назвавший число 1. Доказать, что игра не может продолжаться бесконечно. (J.H.Conway)
Пришло не совсем честное решение. Если речь идёт также и о размене с негативным количеством монет (я тебе, ты мне), то вроде так:
a1*x1 + ... aN*xN = xN+1
Чтобы диофпнтово не решалось, каждая новая монета должна НЕ делиться на наибольшитй общий делитель всех остальных. Таким образом с каждой новой монетой НОД падает. Значит кол-во шагов конечно.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Здравствуйте, Grammer, Вы писали:
G>2b. Если у нас уже есть монеты достоинствами x[0]...x[n] (каждого типа — неограниченнок количество), то можно задать вопрос: как нам выплатить данную сумму денег S минимальным общим числом монет? Напишите соответвующую программу.
/*******************************
* Если у нас уже есть монеты достоинствами x[0]...x[n]
* (каждого типа — неограниченнок количество)
* Как выплатить данную сумму денег S минимальным общим числом монет?
*/#include"stdafx.h"#include <algorithm>
#include <functional>
#include <numeric>
#include <vector>
#include <ctype.h>
using namespace std;
int values[] = {5,50,500, 10000};
vector<int> face_value;
vector<int> sequence;
typedef vector<int>::iterator Iter;
typedef vector<int>::reverse_iterator RIter;
void printVec(vector<int> &v)
{
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
}
//count summ in secuenceint accumulateSeq()
{
return accumulate(sequence.begin(),sequence.end(), 0);
}
//punch in the value in sequencebool completeSummWithValue(int summ, int value)
{
bool result = false;
if (value > summ)
return result;
//push face values to sequence till
//the summ will be equal or GREATER then summwhile(accumulateSeq() < summ)
{
sequence.push_back(value);
}
//is there a solution ?if(accumulateSeq() == summ)
{
result = true;
}
else
sequence.pop_back(); //extract last excess valuereturn result;
}
bool deleteValueFromSeq(int value)
{
//return false if no value was foundif (find(sequence.begin(), sequence.end(), value) == sequence.end())
return false;
//remove value from the end of sequence
//because we seek max value
sequence.erase(find(sequence.rbegin(), sequence.rend(), value).base() - 1);
// printVec(sequence);return true;
}
bool first_check(int summ)
{
bool result = false;
//try to divide at max face_value first ... for (Iter iter = face_value.begin(); iter != face_value.end(); ++iter)
{
result = completeSummWithValue(summ, *iter);
if (result)
break;
}
return result;
}
bool second_check(int summ)
{
bool result = false;
RIter iter = face_value.rbegin();
iter++;
for (; iter != face_value.rend(); ++iter)
{
while(deleteValueFromSeq(*(iter)))
{
result = completeSummWithValue(summ, *(iter-1));
if (result)
break;
}
if (result)
break;
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
int summ;
bool result;
face_value.assign(values, values+(sizeof(values)/sizeof(values[0])));
sort(face_value.begin(), face_value.end(), greater<int>());
cout<<"Possible face_values : ";
printVec(face_value);
while(true)
{
cout<<" Input summ : "<<endl;
cin>>summ;
sequence.clear();
sequence.reserve(summ/face_value[face_value.size()-1]);
//fill the secuence from max to min values
result = first_check(summ);
if (!result)
//process the secuence from min to max
result = second_check(summ);
if (result)
{
printVec(sequence);
}
else
cout<<"Couldn't find a solution ..."<<endl;
}
return 0;
}
Здравствуйте, MaximVK, Вы писали:
MVK>Здравствуйте, olen33, Вы писали:
O>>Я больше склоняюсь к приводившемуся здесь варианту про линию, первый заступивший за которую получает стрелу в лоб, т.к. в условии сказано, что орки эгоистичные твари.
MVK>Не прокатит. Как эгоистичные твари они вытолкнут по очереди пятерых своих товарищей за черту, а потом пойдут кушать эльфа.
надо прочертить линию, стрелять в первого кто ее переступить и сразу вытаскивать стрелу...
G>>28.a (Для мэнеджеров, наверное) Вы — добрый эльф, меткий стрелок из лука. За Вами гонится отряд из 10 орков, злах и эгоистичных тварей. К счастью, они пока далеко позади. К несчастью, через какое-то время они Вас догонят и съедят. К счастью у Вас есть стрелы, которыми Вы можете разить орков наповал. К еще большему счастью, на одного орка хватает одной стрелы и бьете Вы без промаха. К несчастью, у Вас имеется только 5 стрел. К еще большему несчастью, орки об этом знают. Как Вам спастись? (D.Friedman)
Единственный нормальный ответ который я слышал — "брошу пить".