Program JosivFlaviye; Uses CRT; Const n = 8; Type tp = ^bt; bt = record inf: Byte; lnk: tp; off: Boolean; End; Var t, top: tp; f: tp; i: Byte; k: Byte; o: Byte;
Procedure Print; Begin f := t; For i := 1 to n do Begin Write(f^.inf,' '); f := f^.lnk; End; End;
Procedure Schet(s: Byte); Begin t := top; For o := 1 to n - 1 do Begin i := 1; Repeat If (t^.off = False) then inc(i); t := t^.lnk; Until (i = k) and (t^.off = False); Writeln('Вычеркнули ',t^.inf); t^.off := True; End; End;
Begin ClrScr; top := nil; For i := n downto 1 do Begin t := New(tp); t^.inf := i; t^.lnk := top; t^.off := False; top := t; End; f := t; For i := 1 to n-1 do Begin f := f^.lnk; End; f^.lnk := t; Print; Write(#13#10,'До скольки считать: '); Readln(k); Schet(k); While (t^.off = True) do t := t^.lnk; Writeln('Остался ',t^.inf); ReadKey; End.
Є числовий проміжок [N;M]. Треба на цьому проміжку знайти найменше число, яке саме багате на дільники.
Вхідні дані. Перший рядок містить кількість тестових пар. У наступних рядках знаходяться цілі числа N i M ( 1 <= N <= M <= 1000000000, 0 <= M – N <= 10000), що задають числовий проміжок.
Вихідні дані. Для кожного проміжку в одному рядку вивести число, що має найбільшу кількість дільників та їх кількість. ExamplesInput Output 3 1 10 1000 1000 999999900 1000000000
Є числовий проміжок [N;M]. Треба на цьому проміжку знайти найменше число, яке саме багате на дільники.
Вхідні дані. Перший рядок містить кількість тестових пар. У наступних рядках знаходяться цілі числа N i M ( 1 <= N <= M <= 1000000000, 0 <= M – N <= 10000), що задають числовий проміжок.
Вихідні дані. Для кожного проміжку в одному рядку вивести число, що має найбільшу кількість дільників та їх кількість. ExamplesInput Output 3 1 10 1000 1000 999999900 1000000000 6 4 1000 16 999999924 192
парни помогите решить задачу дано натуральное число.Определить можно ли представить его в виде произведения 2 простых чисел.задача по теме цикл по условию. помогите
Vitaliy, обсуждение задачи есть на форуме: http://pascal-for-all.ucoz.ru/forum/10-7-1 Правда желательно код на паскаль переписать, хотя для меня тоже си родной. Я свой вариант тоже напишу ка-нибудь, варианты из задачника, конечно, очень слабые.
я кстати недавно решал эту задачу... и когда мое решение приняло вид моделирование как у вас - то мне это конечноже не понравилось и я решил ее так что у меня на N=1000000000 и K=100000 уходит 0.064 секи)))
гы)) + кода реально меньше)))
а вот рабочий код: int brut(int n,int k) { int r=0; FOR(i,2,n+1) { r=(r+(k%i))%i; } return r; }
int rec(int n,int k) { if (n<=k) return brut(n,k); int ost=n%k; int r=rec(n-n/k,k); r=(r+(n-n/k)-ost)%(n-(n/k)); return r+r/(k-1); }
int solve(int N,int K) { if (K==1) return N-1; return rec(N,K); }
Вот еще один вариант решения, на сей раз с использованием ссылочных типов данных. Различие от решеннея Дмитрия: в записи нет третьего поля типа boolean. Следовательно, другой принцип решения с использованием все того же закольцованного списка.
program Iosig_Flavii_ver2; uses crt; const n = 10; type tp = ^sp; sp = record inf: integer; link: tp; end; var top, k, d: tp; i, j, q: byte;
begin clrscr; writeln('Vvedite kol-vo hodov:'); readln(q);
top := nil; {golovu spiska na ssilaem na nil dlya initializacii spiska}
for i := n downto 1 do {sozdaem spisok} begin getmem(k, sizeOf(tp)); k^.inf := i; k^.link := top; top := k; end;
d := top; {poluchili ssilku na verhnii element (inf = 1)} while d <> nil do begin k := d; d := k^.link; end;
d := k; {poluchili addres pervogo elementa} d^.link := top; {zakol'cevali spisok} k := top; {poluchaem ssilku na pervii element}
j := 1;
while j < n do begin for i := 1 to q - 2 do {idem po ssilkam} k := k^.link; {u} {udalyaem iz spiska element, na kot. ostanovilsya schet} d := k^.link; k^.link := d^.link; freemem(d, sizeOf(d)); {/u} k := k^.link; {poluchaem ssilku na sled. el., s kot. nachnem schet} inc(j); {chtob ne uiti v beskonechnii cikl} end;
writeln('Ostalsya el. #', k^.inf, '.'); readkey; end.
Вот если хотите, то можно обойтись без переменной top: tp.
А вот вариант решения с одномерным массивом! Дим, тебе респект, но в институте требуют два способа! Мы молодцы, однако!
program Iosif_Flavii_ver1; uses crt; const n = 10; {кол-во участников считалочки без считающего} var a: array[1..n] of byte; i, k, d, fst, h, s: byte;
{Описание переменных: fst - с какого начинаем считать; k - до скольеи считать; h - считате сколько прошло ходов h = 1..n-1; s - номер пустого элемента, куда ставим 1; 1 - значит a[i] занято (участник с этим номером выбыл); d - дополнительная переменная; }
procedure OutArr; {vivod massiva} var j: byte; begin for j := 1 to n do if a[j] = 0 then write(j, ' ') else write(' '); writeln; end;
begin clrscr; writeln('Vvedite: '); readln(k);
h := 1; fst := 1; while h < n do begin d := 1; i := fst; while d <= k do {zdes' propuskaem vibivshih igrokov} begin if a[i] <> 1 then begin inc(d); s := i; end; inc(i); if i > n then i := i - n; end; a[s] := 1; fst := i; if fst > n then fst := fst - n; outArr; readkey; inc(h); end;
for i := 1 to n do {vivod iznachal'nogo nomera poslednego igroka} if a[i] = 0 then begin writeln('Nomer ostavshegosya: ', i); break; end; readkey; end.
Че-то я недоглядел ;)) Малёха... Параметр в процедуре Schet можно вообще убрать. Procedure Schet; - вот так.. И вызывать ее без параметра. Ибо он глобален Ну или переменную k локализовать в процедуре "счета"
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]