Очень хитрый вопрос - кто ответит??
С уважением Аvatara
Кто сможет, написать программу, которая меняет значения двух однотипных переменных без использования дополнительной переменной.
С уважением Аvatara
задача для третьего класса церковно-приходской школы:
a = a + b;
b = a - b;
a = a - b;
задача для третьего класса церковно-приходской школы:
a = a + b;
b = a - b;
a = a - b;
Спасибо за ответ
Можно и так
a=a*b
b=a/b
a=a/b
Спасибо за ответ
Можно и так
a=a*b
b=a/b
a=a/b
а если а или b нули?
задача для третьего класса церковно-приходской школы:
a = a + b;
b = a - b;
a = a - b;
Ну вы ж программисты! Или кто?
Более простой вариант:
a ^= b;
b ^= a;
a ^= b;
Ну вы ж программисты! Или кто?
Более простой вариант:
a ^= b;
b ^= a;
a ^= b;
мадам! не надо умничать. сложение/вычитание все равно будет проводиться по модулю того или иного типа данных. и модуль 2 тут не выделяется на фоне других ))
мадам! не надо умничать. сложение/вычитание все равно будет проводиться по модулю того или иного типа данных. и модуль 2 тут не выделяется на фоне других ))
Водопроводчик, ты мне под хвост не заглядывал.
x^=y^=x^=y;
Есть массив элементов:
0, 1, 2, ..., k, k+1, ..., n
Необходимо за минимальное количество операций сделать преобразование его к виду:
k+1, ..., n, 0, 1, 2, ..., k
т.е. поменять местами две части массива. Создавать и использовать другие массивы нельзя, из арифметических операций использовать только присваивание, инкремент и декремент.
Ок. "Раз пошла такая пьянка", другой "очень хитрый вопрос"
Есть массив элементов:
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";
Можно попробовать так
//изменение порядка следования элементов массива
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
Если хватит времени напишу правильный порядок
Кто сможет, написать программу, которая меняет значения двух однотипных переменных без использования дополнительной переменной.
С уважением Аvatara
Есть команда ассемблерная, не помню точно какая.:{
Есть команда ассемблерная, не помню точно какая.:{
Менять куски памяти по условию нельзя ;) так что команда STOSB (точно не помню, книгу по асму отдал) не подойдет...
Ок. "Раз пошла такая пьянка", другой "очень хитрый вопрос"
Есть массив элементов:
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.Надеюсь что угадал:))
Если не ошибаюсь!!! извиняюсь что без кода писать влом:))
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
Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?
Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?
// 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("список не закмкнут");
// 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("список не закмкнут");
Можно сделать оптимальнее.
Подсказка: ограничиться лишь одним циклом.
ограничиться лишь одним циклом.
ограничиться одним циклом, имхо, можно только если под замыканием понимать связь последнего элемента с первым. а если замыкание сделано не на первый элемент, а на какой-нибудь промжуточный?
ограничиться одним циклом, имхо, можно только если под замыканием понимать связь последнего элемента с первым. а если замыкание сделано не на первый элемент, а на какой-нибудь промжуточный?
Ты понял меня слишком буквально. Я не имел в виду один из циклов в твоем варианте. Если бы предполагалось только замыкание на первый элемент, то задача не была бы достойна звания "хитрой" :о)
В твоем варианте количество операций будет ровняться в общем случае квадрату количества элементов с списке. Хотелось бы получить решение с линейной зависимостью, а точнее 2n, где n - кол-во элементов (Это еще одна подсказка).
№ адрес(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)
Вот небольшая таблица которую я получил
№ адрес(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)
а если ты, убьешь несколько первых элементов (ну или одни из первых) а потом выделишь память для новых элементов, но присоеденишь их к хвосту списка, то они могут выделиться как раз там, где память освободилась. Тогда твоя стратегия работать не будет.
Тогда еще одна задачка на сообразительность.
Есть односвязанный список, т.е. каждый элемент содержит указатель на следующий, указатель последнего элемента, если таковой существует (список не замкнут), равен нулю. Есть константный указатель на первый элеиент списка. Необходимо выяснить замкнут ли список или нет, т.е. не ссылается ли какой-нибудь элемент на элемент, который распологается в списке ранее него, замыкая т.о. список и образуя кольцо. Изменять каким либо образом список или его елементы нельзя, создавать параллельный список тоже нельзя. Кто найдет оптимальное решение?
Я придумал только, как решить задачу за количество операций, не большее 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("список не замкнут");
Я придумал только, как решить задачу за количество операций, не большее 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;
}
Вариант
a ^= b;
b ^= a;
a ^= b;
не пройдет для дробных чисел.
Вот тебе и программисты!!
Вариант
a ^= b;
b ^= a;
a ^= b;
не пройдет для дробных чисел.
Вот тебе и программисты!!
Почему же не пройдет-то?! %)