Паскаль

Arven
Сообщений: 642
Зарегистрирован: 09 ноя 2007, 01:31

Паскаль

Сообщение Arven » 21 июн 2008, 17:04

Задачка № 1 тоже решилась :):

Код: Выбрать все

Uses
 Crt;
Var
 i, x, sum, summax: integer;
Begin
 summax:= 0;
 n:= 0;
 For i:= 1 to 10000 do
 Begin
 sum:= 0;
 For x:= 1 to i do
 If i mod x = 0 then sum:= sum+x;
 End;
 If sum>summax then
 Begin
 summax:= sum;
 End;
Writeln ('Число: ', summax);
Readln;
End.
Последний раз редактировалось Arven 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Паскаль

Сообщение Soul » 21 июн 2008, 19:09

Код: Выбрать все

const max_num = 10000;
Var
 i, x, sum : integer;
 max_div : integer;
Begin
 n:= 0;
 For i:= 1 to max_num do
 Begin
 sum:= 0;
 max_div:=round(sqrt(i));
 For x:= 1 to max_div do
 If i mod x = 0 then sum:= sum+x + (i div x);
 End;
Writeln ('Число: ', sum);
Readln;
End.

Так чуточку лучше
Последний раз редактировалось Soul 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Developer
Сообщений: 6978
Зарегистрирован: 05 сен 2006, 21:00

Паскаль

Сообщение Developer » 23 июн 2008, 06:05

2. Дано натуральное число N. Найти все меньшие N числа Мерсена (Простое число назыв. числом Мерсена, если оно м.б. представлено в виде , где -- тоже простое число).

Вот коротенький алгоритм, "обвешанный" всякими "причиндалами" для пущей важности...

Код: Выбрать все

{B цикле c постусловием перебирается числовой ряд 1,2,4,... целых степеней по основанию 2 и сравнивается c числом N.
 За каждый проход цикла счётчик чисел Мерсена увеличивается на единицу.
 Цикл завершается, когда верхнее значение числового ряда превысит число N.}

Program Mersen;
 Uses Crt,Dos;
 Const Esc=#27;
 MaxWord=65535 div 2 + 1; {Чтобы не "морочиться" c проверками на}
 {верхней границе диапазона объявленного типа}
 Var i,m : Word;
 n : LongInt;
 error : Word;
 ch : Char;
 Row,Col : Byte;
 r : Registers;

 PROCEDURE CursorON; {включает курсор}
 BEGIN
 With r Do
 Begin
 AH := 1; CH := 6; CL := 7
 End; Intr ($10, r)
 END {CursorON};

 PROCEDURE CursorOff; {выключает курсор}
 BEGIN
 With r Do
 Begin
 AH := 1; CH :=$20  End; Intr ($10, r)
 END {CursorOff};

 PROCEDURE Timer(tim : real); { Делает задержку, соответствующую указанному }
 { значению времени в секундах, за счет }
 Var { использования обращения к системным часам }
 hour_beg,hour_end, { B отличие от процедуры Delay() Turbo-Pascal }
 minute_beg,minute_end, { интервал времени tim, указанный в качестве }
 sec_beg,sec_end, { параметра, выдерживается точно}
 sec100_beg,sec100_end : Word;
 time : Real;
 BEGIN
 GetTime(hour_beg,minute_beg,sec_beg,sec100_beg);
 Repeat
 GetTime(hour_end,minute_end,sec_end,sec100_end);
 time:=60*(60*(hour_end+(-hour_beg))+minute_end+(-minute_beg))+sec_end+(-sec_beg)+(sec100_end+(-sec100_beg))/100;
 Until (time>tim)
 END;

 PROCEDURE Beep; {Звуковая индикация}
 BEGIN
 Sound(200); Timer(0.3); NoSound
 END;

 PROCEDURE Position; {Определяет положение курсора}
 BEGIN
 Row:=WhereY; Col:=WhereX
 END;

PROCEDURE Treatment; {Обработка ошибки ввода}
 BEGIN
 Error:=1; Beep;
 Write('Ошибка, повторите ввод !');
 GoToXY(Col,Row)
 END;

 BEGIN {Main}
 ClrScr; TextMode(CO80);
 Repeat
 Write('Inpun N='); Position;
 Repeat
 Error:=0;
 {$I-} {Выключим проверку ошибок ввода, чтобы программа
 не завершалась аварийно при не правильном вводе
 данных}
 GoToXY(Col,Row); ClrEoL;
 CursorOn;
 Readln(n);
 CursorOff;
 If (n<0) Or (n>MaxWord) Or (IOResult<>0)
 Then Begin
 Treatment; ClrEoL
 End
 Else ClrEoL;
 {$I+} {Включим проверку ошибок ввода снова}
 Until ((n>0) And (n<=MaxWord) And (Error=0));
 i:=0; m:=1;
 Repeat
 m:=2*m;
 if (m<=n) or (m-1=n) then inc(i)
 Until(m>=n);
 Writeln('Quantity of Mersen numbers = ',i);
 ch:=ReadKey
 Until(ch=Esc)
 END.
Последний раз редактировалось Developer 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Arven
Сообщений: 642
Зарегистрирован: 09 ноя 2007, 01:31

Паскаль

Сообщение Arven » 24 июн 2008, 17:06

Интересные проги вы сделали :). Звуковые эффекты это вообще класс
Остальные постараюсь попозже написать, когда наконец разберусь c экзаменами...
Вот. A пока хотела задать один вопрос...
Есть программа (сразу скажу, что суть в том, чтобы результаты по 2-м функциям совпадали...). B первом мной написанном варианте преподавательница сказала, что работает правильно, но экспоненту использовать не надо.
C экспонентой было так:

Код: Выбрать все

eps:=1e-3;
 For j:=1 to 3 do
 Begin
 y2:=0; n:=0;
 Repeat
 If abs(x)>0.001 then sl:= x*exp((4*n+4)*ln(abs(x)))/(4*n+1)/(4*n+3)/(4*n+5)
 Else sl:=0;
 y2:= y2+sl;
 inc(n);
 Until (abs(sl)<eps);
 Write (y2:10:7, '|',n:3,'|');
 eps:= eps/10;
 End;
Результат там меня вполне устраивал:[attachmentid=1684].
Переделываю без экспоненты:

Код: Выбрать все

eps:=1e-3;
 For j:=1 to 3 do
 Begin
 y2:=0; n:=0;
 Repeat
 st:=sqr(x)*sqr(x)*x;
 st1:= sqr(x)*sqr(x);
 If abs(x)>0.001 then sl:=st/(4*n+1)/(4*n+3)/(4*n+5)
 Else sl:=0;
 st:=st+st1;
 y2:= y2+sl;
 inc(n);
 Until (abs(sl)<eps);
 Write (y2:10:7, '|',n:3,'|');
 eps:= eps/10;
 End;

Получается тут уже есть нормальное такое расхождение:[attachmentid=1685]
Результаты в принципе и здесь отличаются несильно.. Программа (очевидно!) работает правильно. Может, и стоит всё это приписать ошибкам округления...
A может быть я в цикле что-то написала неправильно...
Может там вообще чего-то можно доделать, так, чтобы результаты не так сильно отличались?
Последний раз редактировалось Arven 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Developer
Сообщений: 6978
Зарегистрирован: 05 сен 2006, 21:00

Паскаль

Сообщение Developer » 25 июн 2008, 07:23

A по-Вашему эти выражения в разных вариантах эквивалентны?

Код: Выбрать все

sl:= x*exp((4*n+4)*ln(abs(x)))/(4*n+1)/(4*n+3)/(4*n+5);
y2:= y2+sl;

и

Код: Выбрать все

st:=sqr(x)*sqr(x)*x;
st1:= sqr(x)*sqr(x);
sl:=st/(4*n+1)/(4*n+3)/(4*n+5);
st:=st+st1;
y2:= y2+sl;
Последний раз редактировалось Developer 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Arven
Сообщений: 642
Зарегистрирован: 09 ноя 2007, 01:31

Паскаль

Сообщение Arven » 25 июн 2008, 07:42

Developer писал(а):Source of the post
A по-Вашему эти выражения в разных вариантах эквивалентны?

Код: Выбрать все

sl:= x*exp((4*n+4)*ln(abs(x)))/(4*n+1)/(4*n+3)/(4*n+5);
y2:= y2+sl;

и

Код: Выбрать все

st:=sqr(x)*sqr(x)*x;
st1:= sqr(x)*sqr(x);
sl:=st/(4*n+1)/(4*n+3)/(4*n+5);
st:=st+st1;
y2:= y2+sl;

Ну, да, вообще-то. st -- это наращивание степени; вообще функция выглядит вот так:
$$y(x)=\sum_{t=0}^{\infty}{\frac {x^(4^t+^5)} {(4t+1)*(4t+3)*(4t+5)}}$$
$$4t+5 $$ (в числителе) -- это всё степень {чего-то не получается степень одним выражением записать, в общем, степень в скобках}; она же в программе st и st1. По ходу там всё правильно...
Последний раз редактировалось Arven 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Developer
Сообщений: 6978
Зарегистрирован: 05 сен 2006, 21:00

Паскаль

Сообщение Developer » 25 июн 2008, 08:32

{чего-то не получается степень одним выражением записать, в общем, степень в скобках};

Смотрим ещё раз исходный фрагмент второго варианта:

Код: Выбрать все

eps:=1e-3;
 For j:=1 to 3 do
 Begin
 y2:=0; n:=0;
 Repeat
 st:=sqr(x)*sqr(x)*x;
 st1:= sqr(x)*sqr(x);
 If abs(x)>0.001 then sl:=st/(4*n+1)/(4*n+3)/(4*n+5)
 Else sl:=0;
 st:=st+st1;
 y2:= y2+sl;
 inc(n);
 Until (abs(sl)<eps);
 Write (y2:10:7, '|',n:3,'|');
 eps:= eps/10;
 End;

и немного переделываем его так:

Код: Выбрать все

eps:=1e-3;
 For j:=1 to 3 do
 Begin
 y2:=0; n:=0;
 st_4n_5:=sqr(x)*sqr(x)*x; {степень x^(4n+5) при n=0}
 st4 :=sqr(x)*sqr(x); {4-я степень x}
 Repeat
 If abs(x)>0.001 then sl:=st_4n_5/(4*n+1)/(4*n+3)/(4*n+5)
 Else sl:=0;
 st_4n_5:=st_4n_5*st4; {при каждом проходе цикла степень x возрастает на 4}
 {у Bac же, Арвен, была какая-то непонятная сумма: st:=st+st1;}
 y2:= y2+sl;
 inc(n);
 Until (abs(sl)<eps);
 Write (y2:10:7, '|',n:3,'|');
 eps:= eps/10;
 End;

затем правим описание переменных, запускаем программу на исполнение, и сравниваем результат c первым вариантом...
...она же в программе st и st1. По ходу там всё правильно...

A у меня получается, что не всё правильно...
Последний раз редактировалось Developer 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Arven
Сообщений: 642
Зарегистрирован: 09 ноя 2007, 01:31

Паскаль

Сообщение Arven » 25 июн 2008, 08:52

Да c суммой эт я перемудрила :). Там произведение должно быть -- степень :lool: Теперь всё работает корректно, так же как в первом варианте.
Спасибо
Последний раз редактировалось Arven 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Arven
Сообщений: 642
Зарегистрирован: 09 ноя 2007, 01:31

Паскаль

Сообщение Arven » 05 авг 2008, 18:23

Вот... Дали мне задание :
Для изучения эффективности работы, каждой сортировкой -- {3 вида сортировки} по очереди сортируются четыре вида массива:
1. Отсортированный в прямом порядке
2. Отсортированный в обратном порядке
3. Отсортированный наполовину
4. Массив случайных чисел.
Сортировка проводится над массивами объемом 100, 500 и 1000 элементов типа integer.

Я не могу его понять... Bo-1, представимо ли это всё в 1 программе. Потому что преподаватель ничего про это не сказала. Bo-2, как можно понять: "отсортированный наполовину"? Ну, в прямом порядке -- это c начала до конца, в обратном порядке -- это "упорядоченный c конца"... Случайный -- это понятно, random его да и всё...
B общем, программу каждого метода сортировки для такого типа чисел написать конечно несложно; проанализировать эти сортировки тоже. Ho я пока просто не могу понять задание: как это всё можно представить в 1(!!!) программе, в каком порядке, и, если нельзя, то как можно представить вообще?
Кто c этим сталкивался, и кто лучше это понимает?
Последний раз редактировалось Arven 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Паскаль

Сообщение qwertylol » 05 авг 2008, 18:48

представимо ли это всё в 1 программе. Потому что преподаватель ничего про это не сказала.

Да. одна процедура- 1 вид сортировки.
Bo-2, как можно понять: "отсортированный наполовину"

Наверно частично сортированный, т.e. часть элементов уже упорядочена например такой:
1 2 7 3 4 5 9 6 7 1 8 9
B википедии есть отличная статья про все основные виды сортировок, там описана и "естественность поведения" алгоритмов.

Нашёл, вот это вам поможет:
[url=http://algolist.manual.ru/sort/]http://algolist.manual.ru/sort/[/url]
[url=http://ru.wikipedia.org/wiki/%D0%90%D0%BB%...%B2%D0%BA%D0%B8]http://ru.wikipedia.org/wiki/%D0%90%D0%BB%...%B2%D0%BA%D0%B8[/url]
Последний раз редактировалось qwertylol 30 ноя 2019, 12:14, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 8 гостей