Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Очень хитрый вопрос - кто ответит??

435
07 июля 2003 года
avatara
188 / / 07.07.2003
Кто сможет, написать программу, которая меняет значения двух однотипных переменных без использования дополнительной переменной.
С уважением Аvatara
463
07 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by avatara
Кто сможет, написать программу, которая меняет значения двух однотипных переменных без использования дополнительной переменной.
С уважением Аvatara



задача для третьего класса церковно-приходской школы:

a = a + b;
b = a - b;
a = a - b;

435
07 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by waterman


задача для третьего класса церковно-приходской школы:

a = a + b;
b = a - b;
a = a - b;



Спасибо за ответ
Можно и так
a=a*b
b=a/b
a=a/b

463
07 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by avatara


Спасибо за ответ
Можно и так
a=a*b
b=a/b
a=a/b



а если а или b нули?

3
07 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


задача для третьего класса церковно-приходской школы:

a = a + b;
b = a - b;
a = a - b;




Ну вы ж программисты! Или кто?
Более простой вариант:
a ^= b;
b ^= a;
a ^= b;

463
07 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green



Ну вы ж программисты! Или кто?
Более простой вариант:
a ^= b;
b ^= a;
a ^= b;



мадам! не надо умничать. сложение/вычитание все равно будет проводиться по модулю того или иного типа данных. и модуль 2 тут не выделяется на фоне других ))

3
07 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


мадам! не надо умничать. сложение/вычитание все равно будет проводиться по модулю того или иного типа данных. и модуль 2 тут не выделяется на фоне других ))



Водопроводчик, ты мне под хвост не заглядывал.

4.5K
07 июля 2003 года
Frozik
10 / / 07.07.2003
Хмм, весело, но можно и в одну строчку, хотя это производительности не прибавит, зато удобно читается:

x^=y^=x^=y;
3
08 июля 2003 года
Green
4.8K / / 20.01.2000
Ок. "Раз пошла такая пьянка", другой "очень хитрый вопрос"

Есть массив элементов:

0, 1, 2, ..., k, k+1, ..., n

Необходимо за минимальное количество операций сделать преобразование его к виду:

k+1, ..., n, 0, 1, 2, ..., k

т.е. поменять местами две части массива. Создавать и использовать другие массивы нельзя, из арифметических операций использовать только присваивание, инкремент и декремент.
435
08 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by Green
Ок. "Раз пошла такая пьянка", другой "очень хитрый вопрос"

Есть массив элементов:

0, 1, 2, ..., k, k+1, ..., n

Необходимо за минимальное количество операций сделать преобразование его к виду:

k+1, ..., n, 0, 1, 2, ..., k

т.е. поменять местами две части массива. Создавать и использовать другие массивы нельзя, из арифметических операций использовать только инкремент и декремент.



Можно попробовать так

//изменение порядка следования элементов массива
const K=10;//число можно задать любое
int i,j, S[K];
cout<<"Please Input 10 array elements - ";
cout<<"\n";
for (i=0;i<K;i++)
{
cout<<"S[ "<<i<<" ] - ";
cin>>S;
cout<<"\n";
}
cout<<"Direct order of array - ";
for (i=0;i<K;i++)
{
cout<<S<<" ";
}
cout<<"\n";
cout<<"Reverse order of array - ";
for (i=0,j=K-1;i<K/2;j--,i++)
{
S=S+S[j];
S[j]=S-S[j];
S=S-S[j];
}
for (i=0;i<K;i++)
cout<<S<<" ";
cout<<"\n";

435
08 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by avatara


Можно попробовать так

//изменение порядка следования элементов массива
const K=10;//число можно задать любое
int i,j, S[K];
cout<<"Please Input 10 array elements - ";
cout<<"\n";
for (i=0;i<K;i++)
{
cout<<"S[ "<<i<<" ] - ";
cin>>S;
cout<<"\n";
}
cout<<"Direct order of array - ";
for (i=0;i<K;i++)
{
cout<<S<<" ";
}
cout<<"\n";
cout<<"Reverse order of array - ";
for (i=0,j=K-1;i<K/2;j--,i++)
{
S=S+S[j];
S[j]=S-S[j];
S=S-S[j];
}
for (i=0;i<K;i++)
cout<<S<<" ";
cout<<"\n";




прошу прощения неправильно прочитал - это немного другая перестановка 0, 1, 2 ,3, 4, 5, ...К преобразуется к виду
К ..., 5, 4, 3, 2, 1, 0
Если хватит времени напишу правильный порядок

4.9K
08 июля 2003 года
kycok
1 / / 08.07.2003
Цитата:
Originally posted by avatara
Кто сможет, написать программу, которая меняет значения двух однотипных переменных без использования дополнительной переменной.
С уважением Аvatara



Есть команда ассемблерная, не помню точно какая.:{

4.5K
08 июля 2003 года
Frozik
10 / / 07.07.2003
Цитата:
Originally posted by kycok


Есть команда ассемблерная, не помню точно какая.:{


Менять куски памяти по условию нельзя ;) так что команда STOSB (точно не помню, книгу по асму отдал) не подойдет...

1.8K
09 июля 2003 года
shrize
46 / / 04.12.2002
Цитата:
Originally posted by Green
Ок. "Раз пошла такая пьянка", другой "очень хитрый вопрос"

Есть массив элементов:

0, 1, 2, ..., k, k+1, ..., n

Необходимо за минимальное количество операций сделать преобразование его к виду:

k+1, ..., n, 0, 1, 2, ..., k

т.е. поменять местами две части массива. Создавать и использовать другие массивы нельзя, из арифметических операций использовать только присваивание, инкремент и декремент.


Если не ошибаюсь!!! извиняюсь что без кода писать влом:))
2 функции:
первая принимает (указатель на массив, lbound, ubound)
выполняется цикл дотех пор пока lbound<=uBound
меняются значения(первого с последним и т.д.)
естественно lbound++;uBound--;

вторая ге вызывает первую в таком порядке.
объясню на примере 1 2 3 4 5 6 7 8 9 10 -такого массива, k=5.

первый раз вызываем первую функцию с lbound=0,ubound=k
получаем такой массив 5 4 3 2 1 6 7 8 9 10

далее вываем второй раз первую функцию c lbound=k+1, ubound=10
получаем такой массив 5 4 3 2 1 10 9 8 7 6

и вызываем третий раз с параметрами lbound=1,ubound=10
и получаем 6 7 8 9 10 1 2 3 4 5

P.S.Надеюсь что угадал:))

3
09 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by shrize

Если не ошибаюсь!!! извиняюсь что без кода писать влом:))
2 функции:
первая принимает (указатель на массив, lbound, ubound)
выполняется цикл дотех пор пока lbound<=uBound
меняются значения(первого с последним и т.д.)
естественно lbound++;uBound--;

вторая ге вызывает первую в таком порядке.
объясню на примере 1 2 3 4 5 6 7 8 9 10 -такого массива, k=5.

первый раз вызываем первую функцию с lbound=0,ubound=k
получаем такой массив 5 4 3 2 1 6 7 8 9 10

далее вываем второй раз первую функцию c lbound=k+1, ubound=10
получаем такой массив 5 4 3 2 1 10 9 8 7 6

и вызываем третий раз с параметрами lbound=1,ubound=10
и получаем 6 7 8 9 10 1 2 3 4 5

P.S.Надеюсь что угадал:))



ПЯТЬ БАЛЛОВ !

// 0, 1, 2, ..., k, k+1, ..., n
swap(0, k);
// k, ..., 2, 1, 0, k+1, ..., n
swap(k+1, n);
// k, ..., 2, 1, 0, n, ..., k+1
swap(0, n);
// k+1, ..., n, 0, 1, 2, ..., k

Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?

463
09 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green


Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?



// p_const - константный указатель на начало списка

SomeType *p, *p_tmp;
for(p = p_const; p->next; p = p->next)
__for(p_tmp = p_const; p_tmp != p; p_tmp = p_tmp->next);
____if(p_tmp == p->next)
____{
______output("список замкнут");
______exit(EXIT_SUCCESS);
____}
output("список не закмкнут");

3
09 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


// p_const - константный указатель на начало списка

SomeType *p, *p_tmp;
for(p = p_const; p->next; p = p->next)
__for(p_tmp = p_const; p_tmp != p; p_tmp = p_tmp->next);
____if(p_tmp == p->next)
____{
______output("список замкнут");
______exit(EXIT_SUCCESS);
____}
output("список не закмкнут");



Можно сделать оптимальнее.
Подсказка: ограничиться лишь одним циклом.

463
10 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green

ограничиться лишь одним циклом.



ограничиться одним циклом, имхо, можно только если под замыканием понимать связь последнего элемента с первым. а если замыкание сделано не на первый элемент, а на какой-нибудь промжуточный?

3
10 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


ограничиться одним циклом, имхо, можно только если под замыканием понимать связь последнего элемента с первым. а если замыкание сделано не на первый элемент, а на какой-нибудь промжуточный?



Ты понял меня слишком буквально. Я не имел в виду один из циклов в твоем варианте. Если бы предполагалось только замыкание на первый элемент, то задача не была бы достойна звания "хитрой" :о)
В твоем варианте количество операций будет ровняться в общем случае квадрату количества элементов с списке. Хотелось бы получить решение с линейной зависимостью, а точнее 2n, где n - кол-во элементов (Это еще одна подсказка).

1.8K
11 июля 2003 года
shrize
46 / / 04.12.2002
Вот небольшая таблица которую я получил
№ адрес(HEX) адрес(DEC) size елемент
1 0x00301e70 3153520 8 temp
2 0x00301e30 3153456 64 temp->Next
3 0x00301df0 3153392 64 temp->Next->Next
4 0x00301db0 3153328 64 и т.д.
5 0x00301d70 3153264 64
6 0x00301d30 3153200 64
7 0x00301cf0 3153136 64
8 0x00301cb0 3153072 64
9 0x00301df0 3153392 64
...
где адрес -это адрес элемента, и у 8 элемента Next=3 элементу.
Надеюсь что я опять угадал:))
Из-нее видно, что адрес уменьшается при переходе на следующий элемент в списке.
Вообщем отсюда следует что если адрес следующего элеиента меньше чем предыдущего. вот те и условие нарушение которого и будет что список замкнут. Если это правильно то это получится линейный алгоритм, т.е. O(n)
4.5K
11 июля 2003 года
Frozik
10 / / 07.07.2003
Цитата:
Originally posted by shrize
Вот небольшая таблица которую я получил
№ адрес(HEX) адрес(DEC) size елемент
1 0x00301e70 3153520 8 temp
2 0x00301e30 3153456 64 temp->Next
3 0x00301df0 3153392 64 temp->Next->Next
4 0x00301db0 3153328 64 и т.д.
5 0x00301d70 3153264 64
6 0x00301d30 3153200 64
7 0x00301cf0 3153136 64
8 0x00301cb0 3153072 64
9 0x00301df0 3153392 64
...
где адрес -это адрес элемента, и у 8 элемента Next=3 элементу.
Надеюсь что я опять угадал:))
Из-нее видно, что адрес уменьшается при переходе на следующий элемент в списке.
Вообщем отсюда следует что если адрес следующего элеиента меньше чем предыдущего. вот те и условие нарушение которого и будет что список замкнут. Если это правильно то это получится линейный алгоритм, т.е. O(n)



а если ты, убьешь несколько первых элементов (ну или одни из первых) а потом выделишь память для новых элементов, но присоеденишь их к хвосту списка, то они могут выделиться как раз там, где память освободилась. Тогда твоя стратегия работать не будет.

463
11 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green


Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?



Я придумал только, как решить задачу за количество операций, не большее 3n, где n - количество элементов списка (если под операцией понимать количество переходов p=p->next).

Создаем два указателя, указывающих на начало списка. И двигаем их по списку. Только есть фишка: на каждые два перехода p2=p2->next приходится один переход p1=p1->next. И тогда, если список замкнут, то p2 обратиться когда-нибудь в нуль, если не замкнут - p2 "догонит" p1, то есть они станут равны. Операций действительно нужно не больше 3n.

// p_const - константный указатель на начало списка

SomeType *p1, *p2;
unsigned long i = 0;
p1=p_const;
p2=p_const->next;
for(;p2;p2=p2->next)
{
__if(p2 == p1)
__{
____output("список замкнут");
____exit(EXIT_SUCCESS);
__}
__if(i++ % 2 == 0) p1=p1->next;
}
output("список не замкнут");

3
11 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


Я придумал только, как решить задачу за количество операций, не большее 3n, где n - количество элементов списка (если под операцией понимать количество переходов p=p->next).

Создаем два указателя, указывающих на начало списка. И двигаем их по списку. Только есть фишка: на каждые два перехода p2=p2->next приходится один переход p1=p1->next. И тогда, если список замкнут, то p2 обратиться когда-нибудь в нуль, если не замкнут - p2 "догонит" p1, то есть они станут равны. Операций действительно нужно не больше 3n.

// p_const - константный указатель на начало списка

SomeType *p1, *p2;
unsigned long i = 0;
p1=p_const;
p2=p_const->next;
for(;p2;p2=p2->next)
{
__if(p2 == p1)
__{
____output("список замкнут");
____exit(EXIT_SUCCESS);
__}
__if(i++ % 2 == 0) p1=p1->next;
}
output("список не замкнут");



ПЯТЬ БАЛЛОВ!
С маленьким минусом за реализацию, но идея правильная. Тут применяется решение задачки, решаемые еще в пятом классе, помните про мотоциклистов, которые едут с разными скоростями по кругу?

shrize, к сожалению, твой способ не подходит, Frozik прав. Твой способ прокатил бы если бы это был вектор, но вектора не зацикливаются.

Самое интересное, что вопросы не закрыты, может, кто-то придумает способ получше.

Задачка на знание С++ (простенькая):
пользуясь ВТ, а только головой, написать что будет на выходе, т.е. порядок вызова методов и конструкторов.

class A
{
public:
A() { cout << "A" << "\n"; f(); }
vitual void f(){ cout << "fA" << "\n"; }
};

class B :public A
{
public:
B() { cout << "B" << "\n"; f(); }
/*vitual*/ void f(){ cout << "fB" << "\n"; }
};

void main()
{
B b;
}

435
14 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by waterman


Вариант
a ^= b;
b ^= a;
a ^= b;
не пройдет для дробных чисел.
Вот тебе и программисты!!

463
14 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by avatara

Вариант
a ^= b;
b ^= a;
a ^= b;
не пройдет для дробных чисел.
Вот тебе и программисты!!



Почему же не пройдет-то?! %)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог