Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
ВнизВывести числа от 1 до 100 без циклов и условий Найти похожие ветки
← →
Kerk © (2005-12-05 02:08) [0]Сабж. Такая вот задачка.
← →
Kerk © (2005-12-05 02:09) [1]Будем считать что
> Вывести числа от 1 до N без циклов и условий
для ясности
← →
Джо © (2005-12-05 02:17) [2]WriteLn (1);
WriteLn (2);
WriteLn (3);
...
WriteLn (100);
В чем прикол-то?
← →
Kerk © (2005-12-05 02:20) [3]Джо © (05.12.05 2:17) [2]
См [1].
Количество чисел до запуска программы не известно.
← →
Джо © (2005-12-05 02:28) [4]
> [3] Kerk © (05.12.05 02:20)
> Количество чисел до запуска программы не известно.
Не видел [1], когда писал.
Все равно не понимаю. Где-то ведь эти числа хранятся? От того, где и как хранятся эти N чисел и зависит, как их выводить. Нужно, имхо, строже задачу описать, а то непонятно, в чем соль. Мне, по крайней мере. Что значит N чисел? Каких чисел? И откуда их брать?
← →
Kerk © (2005-12-05 02:31) [5]Джо © (05.12.05 2:28) [4]
От того, где и как хранятся эти N чисел и зависит, как их выводить.
Нигде не хранятся. Они должны генерировать по ходу выполнения программы. Числа от 1 до N выводить, скажем, в консоль по типу того, как у тебя в [2].
← →
Джо © (2005-12-05 02:32) [6]Или как раз и нужно придумать такой способ хранения, чтобы обойтись при выводе без и циклов и сравнений? Тогда и
S := "сюда пишем числа, разделенные концом каретки и возвратом строки";
WriteLn (S);
подходит... Или я невероятно туп?
← →
Джо © (2005-12-05 02:33) [7]
> [6] Джо © (05.12.05 02:32)
Тю, опять поспешил, не видел [5], сорри. Теперь, кажется, понял :)
← →
Джо © (2005-12-05 02:36) [8]Рекурсия подходит?
← →
Kerk © (2005-12-05 02:37) [9]Джо © (05.12.05 2:36) [8]
Рекурсия подходит?
Подходит все что угодно, что ты сможешь сделать без циклов и условий.
← →
Джо © (2005-12-05 03:07) [10]Сорри за еще один тупой вопрос, но спрошу: блок case считается за сравнение? Подозреваю, что да, но все-же.
← →
Джо © (2005-12-05 03:11) [11]Что-то DMClient заглючил и не показывает (у меня) мой последний пост, продублирую:
Сорри за еще один тупой вопрос, но спрошу: блок case считается за сравнение? Подозреваю, что да, но все-же.
← →
Kerk © (2005-12-05 03:11) [12]Джо © (05.12.05 3:07) [10]
блок case считается за сравнение?
Ну конечно. Тот же самый условный переход.
← →
Profi © (2005-12-05 03:20) [13]Вроде задача не решаема. Если только как-то исхитриться с рекурсией + метки. Еще подумаю.
← →
Джо © (2005-12-05 03:31) [14]
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
MaxN: Integer;
procedure NextN (N: Integer);
var
Dummy: Double;
begin
Dummy := 1 / (N-MaxN-1);
WriteLn (N);
Inc (N);
NextN (N);
end;
begin
ReadLn (MaxN);
try
NextN(1);
except
end;
ReadLn;
end.
Ни одного цикла и сравнения, всё тип-топ ;->
П.С. Отключить оптимизацию.
← →
Profi © (2005-12-05 03:35) [15]Джо © (05.12.05 3:31) [14]
Блин, опередил, я только Delphi запустил, хотел проверить. Правда, я try думал в функции использовать. Сейчас свой вариант приведу.
← →
Profi © (2005-12-05 03:48) [16]Джо © (05.12.05 3:31) [14]
Ага, с оптимизацией не катит!
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
S,N:Integer;
Procedure Wr(S:integer);
var
i:extended;
begin
Try
i:=1/(N-S);
writeln(S);
inc(S);
Wr(S);
Except
exit;
end;
end;
begin
write("Введите N ");
readln(N);
Wr(0);
readln;
end.
← →
Profi © (2005-12-05 03:49) [17]Profi © (05.12.05 3:48) [16]
Немного переделал:program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
S,N:Integer;
Procedure Wr(S:integer);
var
i:extended;
begin
Try
inc(S);
writeln(S);
i:=1/(N-S);
Wr(S);
Except
exit;
end;
end;
begin
write("Введите N ");
readln(N);
Wr(-1);
readln;
end.
← →
Джо © (2005-12-05 04:03) [18]
> [17] Profi © (05.12.05 03:49)
У меня код короче :p
← →
Lamer@fools.ua © (2005-12-05 08:14) [19]>>Джо © (05.12.05 03:31) [14]
>П.С. Отключить оптимизацию.
Эх. Учи, учи, одни двойки :o)program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
MaxN: Integer;
function NextN(N: Integer): Double;
var
Dummy: Double;
begin
Result := 1 / (N - MaxN - 1);
WriteLn(N);
NextN(N + 1);
end;
begin
ReadLn(MaxN);
try
NextN(1);
except
end;
ReadLn;
end.
← →
Гость1 (2005-12-05 10:31) [20]try
except
по большому счету тот же условный переход, только завуалированный :)
можно и без него обойтись :)
type
TMyEvent = procedure (n, maxn: integer) of object;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
fEvents: array [boolean] of TMyEvent;
procedure NextN(n, maxn: integer);
procedure StopN(n, maxn: integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.NextN(n, maxn: integer);
begin
ListBox1.Items.Add(IntToSTr(n));
fEvents[n=maxn](n+1, maxn);
end;
procedure TForm1.StopN(n, maxn: integer);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
fEvents[true]:=StopN;
fEvents[false]:=NextN;
NextN(0, StrToInt(Edit1.Text));
end;
но здесь, конечно, тоже "мухлеж"
условный переход замаскирован под обращение к элементу массива :)
А так, задача решения не имеет.
← →
Anatoly Podgoretsky © (2005-12-05 10:34) [21]Рекурсия это тоже цикл - рекурсивный цикл
← →
Sandman29 © (2005-12-05 10:37) [22]А так, задача решения не имеет.
Имеет. Выводим все числа в вечной рекурсии начиная с 1.
То, что программа не должна выводить N+1, не написано. То, что программа не должа вылетать по переполнению стека или числа, тоже не написано :)
← →
Труп Васи Доброго © (2005-12-05 10:58) [23]Sandman29 © (05.12.05 10:37) [22]
Выводим все числа в вечной рекурсии начиная с 1.
Тогда уж проще некуда, и без всякой рекурсии, GOTO рулит!
← →
Гость1 (2005-12-05 11:02) [24]
> Труп Васи Доброго © (05.12.05 10:58) [23]
GOTO - типа цикл :)
← →
umbra © (2005-12-05 11:04) [25]2 Гость1 (05.12.05 11:02) [24]
GOTO - не цикл, а безусловный переход. Циклы и условные переходы сего помощью организуются.
← →
КаПиБаРа © (2005-12-05 11:15) [26]
// Извеняюсь за свой ассемблер, последний раз писал больше 10 лет назад и
// то под Z80
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
N, MaxN, c, m: Longword;
procedure SetLabel; // Корявенькая процедура определения текущего местоположения в памяти
begin
asm
pop EDX; // Загружаем в адрес процедуы вывода числа
push EDX; // По адресу ECX-4 ,будет расположен указатель на точку выхода
push EDX; // По адресу ECX-8 ,будет расположен указатель на процедуру вывода числа
push EDX; // Адресс возврата из подпрограммы
add EDX, $20; // Задаем адресс точки выхода
mov [ESP+8], EDX; // Заносим его в стек
end;
end;
procedure Output; // Процедура вывода числа
begin
writeln(MaxN-N+1);
dec(N);
c := 2 * N div (N + 1); // Возвращает 0 если N = 0 или 1 если N > 0;
// Если 0 - заканчиваем расчет
// Если 1 - продолжаем;
c := (c + 1) * 4; // Определяем смещение для точки перехода
end;
begin
ReadLN(MaxN);
N := MaxN;
// Определяем местоположение программы в памяти и точки перехода
asm
Push EDX
Push ECX; // Освобождаем регистр
mov ECX, ESP; // Запоминаем в него адрес вершины стека;
call SetLabel; // Задаем метки
push ECX; // Сохраняем региистр, что бы не затерся во время вывода
end;
// Выводим число
Output;
// Определяем точку перехода
asm
pop ECX; // Загружаем регистр
push EAX; // Сохраняем регистры для операций по вычислению адреса перехода
push EBX;
mov EAX, c;
mov EBX, ECX;
sub EBX, EAX;
mov EDX, [EBX];
pop EBX // Загружаем регистры
pop EAX;
jmp EDX;
nop; // В этом районе находится точка выхода (лень точно вычислять)
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
pop ECX; // Освобождаем память от переменной в которой хранили адресс перехода
pop ECX; // Освобождаем память от переменной в которой хранили адресс перехода
pop ECX;
pop EDX;
end;
ReadLN
end.
← →
КаПиБаРа © (2005-12-05 11:20) [27]Практически то же что и в Гость1 (05.12.05 10:31) [20]
← →
Kerk © (2005-12-05 11:59) [28]Гость1 (05.12.05 10:31) [20]
Я почти также решил :)
← →
Владислав © (2005-12-05 17:12) [29]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
procedure OutputAll(Count: Integer);
procedure Output(Number: Integer);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Output(Number: Integer);
begin
Memo1.Lines.Add(IntToStr(Number));
end;
procedure TForm1.OutputAll(Count: Integer);
asm
PUSH EBX
PUSH EBP
MOV EBP, ESP
LEA ECX, @@done
PUSH ECX
LEA ECX, @@output
PUSH ECX
MOV ECX, EDX
@@output:
PUSH EAX
PUSH EDX
PUSH ECX
SUB EDX, ECX
ADD EDX, 1
CALL TForm1.Output
POP ECX
POP EDX
POP EAX
SUB ECX, 1
TEST ECX, ECX
PUSHF
POP BX
AND EBX, $40
SHR EBX, $04
LEA EBX, [EBP + EBX - $08]
JMP [EBX]
@@done:
POP ECX
POP ECX
POP EBP
POP EBX
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Count: Integer;
begin
Count := StrToIntDef(Edit1.Text, 3);
OutputAll(Count);
end;
end.
← →
VirEx © (2005-12-05 17:40) [30]! TEST ECX, ECX
← →
Владислав © (2005-12-05 17:47) [31]
> VirEx © (05.12.05 17:40) [30]
> ! TEST ECX, ECX
:)procedure TForm1.OutputAll(Count: Integer);
asm
PUSH EBX
PUSH EBP
MOV EBP, ESP
LEA ECX, @@done
PUSH ECX
LEA ECX, @@output
PUSH ECX
MOV ECX, EDX
@@output:
PUSH EAX
PUSH EDX
PUSH ECX
SUB EDX, ECX
ADD EDX, 1
CALL TForm1.Output
POP ECX
POP EDX
POP EAX
SUB ECX, 1
MOV EBX, ECX
AND EBX, EBX
PUSHF
POP BX
AND EBX, $40
SHR EBX, $04
LEA EBX, [EBP + EBX - $08]
JMP [EBX]
@@done:
POP ECX
POP ECX
POP EBP
POP EBX
end;
← →
Метроном (2005-12-05 17:49) [32]
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Tag := StrToInt(Edit1.Text);
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Tag := Timer1.Tag-1;
Memo1.Lines.Add(IntToStr(StrToInt(Edit1.Text)- Timer1.Tag));
Timer1.Enabled := Boolean(Timer1.Tag);
end;
← →
Владислав © (2005-12-05 18:17) [33]Немного поупражнялся :)
procedure TForm1.OutputAll(Count: Integer);
asm
PUSH EBP
MOV EBP, ESP
PUSH OFFSET @@done
PUSH OFFSET @@output
PUSH EAX
PUSH EDX
ADD EDX, 1
PUSH EDX
@@output:
SUB EDX, [EBP - $10]
CALL TForm1.Output
SUB [EBP - $10], 1
MOV EAX, [EBP - $0C]
MOV EDX, [EBP - $14]
PUSHF
POP CX
AND ECX, $40
SHR ECX, $04
JMP [EBP + ECX - $08]
@@done:
ADD ESP, $14
POP EBP
end;
← →
VirEx © (2005-12-05 18:41) [34]
> Метроном (05.12.05 17:49) [32]
негодится - условие от "1 до ...", но "финт ушами" удался :) (хотя всёже проблема решена на техническом уровне но не на логическом, т.е. не все языки это переварят)
> Владислав © (05.12.05 18:17) [33]
аналогично (в смысле решения задачи) :) всякие "хитрые" сдвиги, умножения и переходы по фикс. адресу
← →
Метроном (2005-12-05 19:07) [35]
> негодится - условие от "1 до ...", но "финт ушами" удался
> :) (хотя всёже проблема решена на техническом уровне но
> не на логическом, т.е. не все языки это переварят)
А ты попробуй. Выводятся числа именно от 1 до ...
← →
VirEx © (2005-12-05 19:20) [36]
> Метроном (05.12.05 19:07) [35]
> А ты попробуй. Выводятся числа именно от 1 до ...
а ну да тыже тэг уменьшаешь а результат как разница... ай эм сорри :)
← →
Verg © (2005-12-05 20:30) [37]
> Гость1 (05.12.05 11:02) [24]
Вызов процедуры - разновидность "goto", значит вызов процедуры тоже цикл?
см. [21]
← →
Gero © (2005-12-05 22:29) [38]
procedure WriteFrom1ToN(N: Integer);
procedure NextN(Num: Integer);
var
E: Integer;
begin
E := Round(0 / (Num - N - 1));
Writeln(Num);
NextN(Num + 1);
end;
begin
NextN(1);
end;
← →
Владислав © (2005-12-06 07:47) [39]
> VirEx © (05.12.05 18:41) [34]
>
> аналогично (в смысле решения задачи) :) всякие "хитрые"
> сдвиги, умножения и переходы по фикс. адресу
Ну и? :)
← →
Гость1 (2005-12-06 09:56) [40]
> Verg © (05.12.05 20:30) [37]
>
> > Гость1 (05.12.05 11:02) [24]
>
>
> Вызов процедуры - разновидность "goto", значит вызов процедуры
> тоже цикл?
> см. [21]
> umbra © (05.12.05 11:04) [25]
> 2 Гость1 (05.12.05 11:02) [24]
>
> GOTO - не цикл, а безусловный переход. Циклы и условные
> переходы сего помощью организуются.
Не надо вырывать слов из контекста.
> Гость1 (05.12.05 11:02) [24]
>
> > Труп Васи Доброго © (05.12.05 10:58) [23]
>
> GOTO - типа цикл :)
было сказано в конексте 23, которое было ответом на 22.
Или вы считаете, что
lb1: writeln(n)
inc(n)
GOTO lb1;
это не цикл?
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.011 c