Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
class Welcome
{
public:
Welcome() {cout<<"Welcome!\n";}
}
int main()
{
Welcom arr[1000000];
}
Re[2]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Очень быстро: 2^20 = 1048576
Delphi:
var
s: string;
begin
s := 'Welcome';
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
writeln(s);
end.
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
main() {
printf( "1.000.000 raz 'Welcome'" );
}
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Если заменить %2 и /=2 на &1 и <<=1, то станет видно, что двоично-логарифмический способ — это не что иное, как проверка битов.
Кстати, фокус с суммированием строки — очень коварный.
Во-первых, требуется 800000 байт памяти, во-вторых, его "наивная" реализация приведёт к жутким тормозам — до O(N^2).
N>Очень быстро: 2^20 = 1048576
Поправка, если учитывать разложение 1000000 = 11110100001001000000
то получится следующий код из ~20 строк.
Delphi:
var
s: string;
begin
s := 'Welcome'#10;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s; write(s);
s := s + s;
s := s + s;
s := s + s; write(s);
s := s + s;
s := s + s;
s := s + s;
s := s + s;
s := s + s; write(s);
s := s + s;
s := s + s; write(s);
s := s + s; write(s);
s := s + s; write(s);
s := s + s; write(s);
end.
В итоге ровно 1000000 строк Welcome
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Console.Writeln ("Welcome");
Copy-Paste 1.000.000 раз
Таймер сделай.
Всё заканчивается плохо. Если что-то закончилось хорошо — значит оно еще не закончилось.
Re[2]: kak mozno napechata 100000 raz "welcome" ne ispolzya
От:
Аноним
Дата:
25.01.05 17:06
Оценка:
a ya nashol reshenia poproshche
nujno obedinit 1000000 kompiuterov v set i potom v command prompte napechatat net send all welcome
i vsio
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Можно вызвать внешнюю функцию, которая сделает это за нас:
#include <iostream>
#include <algorithm>
int main()
{
using namespace std;
fill_n( ostream_iterator<char const*>(cout), 1000000, "Welcome " );
}
Хочу прояснить саму идею: когда вызывается какая-то функция, то в стек заносится адрес возврата (адрес команды следующий за командой вызова)!!! Лубая функция завершается коммандой ret, которая передаёт управление по адресу, находящемуся в вершине стека (ss:esp/sp) и "удаляет" это значение из стека!!! В примере, что я привёл делается следующие: есть счётчик в котором хранится номер вывода (в нашем случаем от 1 до 1000) и если этот счётчик не достиг конечного значения, то кладём в стек адрес начала функции PrintWelcome и соответственно команда ret вернёт нас не туда откуда мы в эту функцию пришли, а в неё самую!!! Когда счётчик достигнет конечного значения, то в стек ничего не кладём, соответственно ret получит адрес возврата из функции!!!
В отличии от рекурсии при таком подходе мы никогда не выжрем стек, соответственно вызовов может быть хоть 1000000000 и всё будет пучком!!!
Надеюсь это то, что ты и хотел получить!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
kak mozno napechata 100000 raz "welcome" ne ispolzya loop?
byl ya na sobesedovanii na raboty c++/C#.
zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
18.02.05 15:11: Перенесено из 'Алгоритмы'
Kostya
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Ах, без goto... Ну, можно написать программу, которая сгенерирует миллион строчек printf
Без рекурсии тут, по-моему, никак...
--
wbr, Peter Taran
Re[2]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, tacit_one, Вы писали:
_>Здравствуйте, kosfr, Вы писали:
K>>byl ya na sobesedovanii na raboty c++/C#. K>>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
_>
_>main() {
_> printf( "1.000.000 raz 'Welcome'" );
_>}
_>
klass
Kostya
Re[3]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, Nev0, Вы писали:
N>>Очень быстро: 2^20 = 1048576 N>Поправка, если учитывать разложение 1000000 = 11110100001001000000 N>то получится следующий код из ~20 строк. N>Delphi: N>
N>var
N> s: string;
N>begin
N> s := 'Welcome'#10;
N> s := s + s;
N> s := s + s;
N> s := s + s;
N> s := s + s;
N> s := s + s;
N> s := s + s; write(s);
N> s := s + s;
N> s := s + s;
N> s := s + s; write(s);
N> s := s + s;
N> s := s + s;
N> s := s + s;
N> s := s + s;
N> s := s + s; write(s);
N> s := s + s;
N> s := s + s; write(s);
N> s := s + s; write(s);
N> s := s + s; write(s);
N> s := s + s; write(s);
N>end.
N>
N>В итоге ровно 1000000 строк Welcome
prikolno.
Kostya
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, Stanky, Вы писали:
S>Хочу прояснить саму идею: когда вызывается какая-то функция, то в стек заносится адрес возврата (адрес команды следующий за командой вызова)!!! Лубая функция завершается коммандой ret, которая передаёт управление по адресу, находящемуся в вершине стека (ss:esp/sp) и "удаляет" это значение из стека!!! В примере, что я привёл делается следующие: есть счётчик в котором хранится номер вывода (в нашем случаем от 1 до 1000) и если этот счётчик не достиг конечного значения, то кладём в стек адрес начала функции PrintWelcome и соответственно команда ret вернёт нас не туда откуда мы в эту функцию пришли, а в неё самую!!! Когда счётчик достигнет конечного значения, то в стек ничего не кладём, соответственно ret получит адрес возврата из функции!!! S>В отличии от рекурсии при таком подходе мы никогда не выжрем стек, соответственно вызовов может быть хоть 1000000000 и всё будет пучком!!!
S>Надеюсь это то, что ты и хотел получить!!!
Во-первых, здесь реализован цикл с декрементом счётчика (а в задании есть ограничение на циклы)
Во-вторых, это всего лишь вариация на тему setjmp/longjmp — всего лишь вычурная форма goto (а на него тоже есть ограничения)
Вот как это можно было бы сделать на Си:
int count=100000;
jmp_buf env;
setjmp(env);
printf("welcome");
if(--count) longjmp(env,0);
Перекуём баги на фичи!
Re[4]: kak mozno napechata 100000 raz "welcome" ne ispolzya
> Во-первых, здесь реализован цикл с декрементом счётчика (а в задании > есть ограничение на циклы) >
Не понял, можно разъяснить?
> Во-вторых, это всего лишь вариация на тему setjmp/longjmp — всего лишь > вычурная форма goto (а на него тоже есть ограничения) >
Тогда получается, что кроме goto в процах вообще ничего нет!!!
Ведь та же рекурсия (вызов функции) организуется через команду call, а это тотже goto (jmp) только в стек записывается адрес возврата!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: kak mozno napechata 100000 raz "welcome" ne ispolzya
S>Тогда получается, что кроме goto в процах вообще ничего нет!!! S>Ведь та же рекурсия (вызов функции) организуется через команду call, а это тотже goto (jmp) только в стек записывается адрес возврата!!!
К чему споры, задание было на C++ или C#
Re[6]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, Stanky, Вы писали:
>> Во-первых, здесь реализован цикл с декрементом счётчика (а в задании >> есть ограничение на циклы) >> S>Не понял, можно разъяснить?
Очень просто. Давай вместо push/ret напишем человеческое goto. Получится цикл.
>> Во-вторых, это всего лишь вариация на тему setjmp/longjmp — всего лишь >> вычурная форма goto (а на него тоже есть ограничения) >> S>Тогда получается, что кроме goto в процах вообще ничего нет!!! S>Ведь та же рекурсия (вызов функции) организуется через команду call, а это тотже goto (jmp) только в стек записывается адрес возврата!!!
Это лишь один из способов организовать рекурсию.
Языки обработки символов списков (тот же Лисп) могут делать это по-другому.
Например, выполнять подстановку тела функции в выражение, и последовательно интерпретировать.
Перекуём баги на фичи!
Re[6]: kak mozno napechata 100000 raz "welcome" ne ispolzya
> Очень просто. Давай вместо push/ret напишем человеческое goto. >
Ну без команд перехода не обойтись вообще, так как даже if, switch/case, вызов функций, прерываний и т. д. их использует!!!
Так что получается, что задача просто нерешаемая!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: kak mozno napechata 100000 raz "welcome" ne ispolzya loo
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Print RepeatString(1000000, "Welcome")
Re[7]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, Stanky, Вы писали:
S>Ну без команд перехода не обойтись вообще, так как даже if, switch/case, вызов функций, прерываний и т. д. их использует!!! S>Так что получается, что задача просто нерешаемая!!!
Шаблонное программирование — может развернуть всё в один длинный-предлинный код (100000 раз повторит printf("welcome")). Потому что инлайн.
Разумеется, будем считать вызов printf атомарным. А почему бы и нет? Может, это инструкция для DMA-контроллера?..
Перекуём баги на фичи!
Re[3]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, kosfr, Вы писали:
K>byl ya na sobesedovanii na raboty c++/C#. K>zadali vopros: kak napisat ne vazno na kakomyazuke 1.000.000 raz "Welcome" ne ispolzya: goto, for, while, do-while etc. parvui sposob recyrsia, a vtoroi????
Скомпилировать
template<int count>
class WW {
public:
static void DoIt()
{
int Welcome;
WW<count - 1>::DoIt();
}
};
template<>
class WW<0> {
public:
static void DoIt() {}
};
static int f()
{
WW<1000 * 1000>::DoIt();
}
Правлда я рискнул попробовать только 100 раз напечатать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, Кодт, Вы писали:
К>Конечно! Между тем, есть действенный вариант с шаблонами. См. выше по ветке...
Конечно есть, правда это не совсем соответсвует заданию, что типа не рекурсия
Но зато прикольно, что можно печатать не в stdout, скажем, а влог компиляции )
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: kak mozno napechata 100000 raz "welcome" ne ispolzya
А что за компилятор и какое число повторов ставил?
На самом деле, если кто-то не заметил, эта штука печатает Welcome не при работе, а при компиляции
В предупреждениеях о неиспользуемой переменной Welcome
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: kak mozno napechata 100000 raz "welcome" ne ispolzya
Здравствуйте, Erop, Вы писали:
E>А что за компилятор
Visual C++ 7.1
E>и какое число повторов ставил?
1000000, как в примере
E>На самом деле, если кто-то не заметил, эта штука печатает Welcome не при работе, а при компиляции E>В предупреждениеях о неиспользуемой переменной Welcome
Ну это я понял, просто интересно было посмотреть, что скажет компилятор.
Сообщения о не используемой переменной я задавил int Welcome = 0, а то компиляция длится д-о-о-о-о-о-о-о-лго.