Re[2]: Интересные задачки для программистов
От: phys  
Дата: 11.01.07 08:18
Оценка:
Здравствуйте, phys, Вы писали:

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;
}
Re[2]: Интересные задачки для программистов
От: jhfrek Россия  
Дата: 11.01.07 10:16
Оценка: :)
Здравствуйте, Багер, Вы писали:

Б>Насчёт задачки про два выключателя на одну лампочку.

Б>Решение, использующееся у меня на даче — один обыкновенный переключатель, один двойной.
Б>Есть другие решения?

Избавиться нафиг от проводов и заменить выключатели на мышей, прибитых к стенке. При клике по любой кнопки мыши программа посылает соответствующий пакет по WiFi — его ловит комп управляющий лампой и меняет состояние лампы не противоположное.
Re[3]: Интересные задачки для программистов
От: _JoKe_  
Дата: 11.01.07 13:51
Оценка:
Здравствуйте, 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)
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: Интересные задачки для программистов
От: Аноним Великобритания  
Дата: 11.01.07 14:11
Оценка:
_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)
А я придумал перебором:
bool isPowerOfTwo(int v)
{
    for(int i=1; i; i<<1)
    {
        if(i == v) return true;
    }
    return false;
}

Я кто?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Интересные задачки для программистов
От: _JoKe_  
Дата: 11.01.07 14:42
Оценка:
>> bool isPowerOfTwo( int v ){ return (!(v & (v — 1)) && v); }
А>А я придумал перебором:
А>
А>bool isPowerOfTwo(int v)
А>{
А>    for(int i=1; i; i<<1)
А>    {
А>        if(i == v) return true;
А>    }
А>    return false;
А>}
А>


А>Я кто?


индус без обид — оцени твоей функции надо столько итераций сколько бит в числе, при этом есть условные переходы, которые могут конвеер сбросить
к тому же ошибка в цикле надо писать не i << 1 а i<<=1

моей меньше 10 тактов которые никогда не вызывают перегруз процессорного конвеера
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: Интересные задачки для программистов
От: phys  
Дата: 12.01.07 09:31
Оценка:
Здравствуйте, _JoKe_, Вы писали:

_JK>Здравствуйте, phys, Вы писали:


P>>Здравствуйте, phys, Вы писали:


P>>15. Дано число. Определить, является ли оно целой степенью 2. (Microsoft и другие)

_JK>много кода поскипано.....
_JK>ЖЕСТЬ!!!!


_JK>а может проще так:

_JK>
_JK>bool isPowerOfTwo( int v ){ return (!(v & (v - 1)) && v); }
_JK>


это не работает ....
Re[5]: Интересные задачки для программистов
От: phys  
Дата: 12.01.07 09:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>_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)
А>А я придумал перебором:
А>
А>bool isPowerOfTwo(int v)
А>{
А>    for(int i=1; i; i<<1)
А>    {
А>        if(i == v) return true;
А>    }
А>    return false;
А>}
А>

А>Я кто?

это тоже не пашет .... господа, проверяйте чего пишите то
Re[5]: Интересные задачки для программистов
От: phys  
Дата: 12.01.07 09:49
Оценка:
Здравствуйте, 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>это не работает ....


я ошибся — работает видимо я на уровне начинающего индуса , но я почему то по этому поводу не переживаю
Re[6]: Интересные задачки для программистов
От: raskin Россия  
Дата: 12.01.07 10:39
Оценка:
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, не
очень приятно.
Posted via RSDN NNTP Server 2.1 beta
Re: Интересные задачки для программистов
От: sugarde  
Дата: 12.01.07 11:33
Оценка:
>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стижении истины.
Re: Интересные задачки для программистов
От: phys  
Дата: 12.01.07 13:59
Оценка:
Здравствуйте, 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 secuence
int accumulateSeq()
{
    return accumulate(sequence.begin(),sequence.end(), 0);
}

//punch in the value in sequence
bool 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 summ
    while(accumulateSeq() < summ)
    {
        sequence.push_back(value);
    }

    //is there a solution ?
    if(accumulateSeq() == summ)
    {
        result = true;
    }
    else
        sequence.pop_back();    //extract last excess value

    return result;
}

bool deleteValueFromSeq(int value)
{
    //return false if no value was found
    if (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;
}
Re[6]: Интересные задачки для программистов
От: Аноним Великобритания  
Дата: 12.01.07 14:57
Оценка:
phys wrote:
> А>bool isPowerOfTwo(int v)
> А>{
> А>    for(int i=1; i; i<<1)
> А>    {
> А>        if(i == v) return true;
> А>    }
> А>    return false;
> А>}
> А>

> это тоже не пашет .... господа, проверяйте чего пишите то
Дык лень было компилить, легко заметить, что надо "i<<=1" вместо "i<<1" написать.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Интересные задачки для программистов
От: Muxa  
Дата: 19.01.07 21:14
Оценка:
Здравствуйте, MaximVK, Вы писали:

MVK>Здравствуйте, olen33, Вы писали:


O>>Я больше склоняюсь к приводившемуся здесь варианту про линию, первый заступивший за которую получает стрелу в лоб, т.к. в условии сказано, что орки эгоистичные твари.


MVK>Не прокатит. Как эгоистичные твари они вытолкнут по очереди пятерых своих товарищей за черту, а потом пойдут кушать эльфа.


надо прочертить линию, стрелять в первого кто ее переступить и сразу вытаскивать стрелу...
Re[4]: Интересные задачки для программистов
От: ursoft2004  
Дата: 24.05.08 21:56
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT> Надо бежать по большому кругу, вытаскивая стрелы из трупов.


менеджеру, который эльф, следует проснуться — негоже спать на работе
Re[2]: Интересные задачки для программистов
От: PaulMinelly  
Дата: 26.05.08 05:37
Оценка:
G>>28.a (Для мэнеджеров, наверное) Вы — добрый эльф, меткий стрелок из лука. За Вами гонится отряд из 10 орков, злах и эгоистичных тварей. К счастью, они пока далеко позади. К несчастью, через какое-то время они Вас догонят и съедят. К счастью у Вас есть стрелы, которыми Вы можете разить орков наповал. К еще большему счастью, на одного орка хватает одной стрелы и бьете Вы без промаха. К несчастью, у Вас имеется только 5 стрел. К еще большему несчастью, орки об этом знают. Как Вам спастись? (D.Friedman)


Единственный нормальный ответ который я слышал — "брошу пить".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.