28.11.2010, 20:19 | #1 (permalink) |
Новичок
Регистрация: 28.11.2010
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите, пожалуйста, исправить ошибку в коде
Перечислить все пары простых чисел-близнецов, не превосходящих заданного числа n, троичные представления которых получаются друг из друга записью цифр в обратном по-рядке (первая такая пара - это 5 и 7). вот сам код: Код: program zadacha_1; uses crt; type chisla=array[1..100]of integer; mas_ch=array[1..100] of string; var k,n:integer; sim:chisla; sim_tr,s_sim:mas_ch; procedure resheto(n:integer; var sim:chisla); {поиск простых чисел с применением решета Эратосфена} var i,j,p:integer; begin p:=1; for i:=1 to n do sim[i]:=i; for i:=1 to n do begin if sim[i]<>0 then inc(p); j:=i; while j<=n do if (sim[j] mod p = 0) and (sim[j]>p) then begin sim[j]:=0; inc(j); end else inc(j); end; sim[1]:=0; writeln('Sinmple numbers:'); for i:=1 to n do if sim[i]<>0 then write(sim[i],' '); end; procedure trancf(n:integer; sim:chisla; var sim_tr:mas_ch; var k:integer); {перевод найденных простых чисел в троичную систему} var i,x,num:integer; st,r:string; begin k:=1; for i:=1 to n do begin if sim[i]<>0 then begin num:=sim[i]; r:=''; repeat x:=num mod 3; str(x,st); r:=r+st; num:=num div 3; st:=''; until num=0; sim_tr[k]:=r; inc(k); end; end; writeln('k=', k); end; procedure revers(sim_tr:mas_ch; k:integer); {формирование массива чисел с обратным троичным представлением и поиск пар-близнецов по условию задачи} var i,j,l,g:integer; old, new:string; begin for i:=1 to k do begin old:=sim_tr[i]; new:=s_sim[i]; l:=length(old); for j:=1 to l do new[j]:=old[l-j]; end; writeln; writeln('Twins simple numbers: '); for i:=1 to k do for g:=1 to k do if s_sim[i]=sim_tr[g] then writeln(s_sim[i], '-' ,sim_tr[g]); end; BEGIN clrscr; write('n>13: '); readln(n); resheto(n,sim); trancf(n,sim,sim_tr,k); revers(sim_tr,k); readkey; END. |
28.11.2010, 20:19 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
На нашем форуме так же имеются похожие темы Open GL, пожалуйста, помогите исправить ошибки в программе Помогите исправить ошибку в программе Помогите найти ошибку в коде Помогите пожалуйста найти ошибку Помогите, пожалуйста, исправить программку на Паскале Паскаль. Пожалуйста, помогите найти ошибку! |
28.11.2010, 22:46 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Таня, когда Вам это нужно сделать? Начал было исправлять, но чувствую, уже под вечер соображаю плохо.
Вообще ошибок много. Во-первых, в процедуре revers Вы используете идентификатор new - это недопустимо, new - зарезервированное слово в Паскале. Потом абсолютно некорректно и даже невразумительно построена процедура перевода чисел в троичную систему. Она попросту не работает. Так что подумайте сами, а если не придумаете, я завтра вечером попробую отредактировать. |
29.11.2010, 11:25 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну раз так, то несколько ускорил процесс. Ниже выложена полностью отлаженная программа. Правда, исходный код пришлось основательно переработать. Вот список изменений:
1. Косметика. Именовать одинаково параметры процедуры и глобальные (подставляемые в процедуру) параметры хоть и допустимо, но, с моей (и не только) точки зрения - неряшливость и дурной тон. Исправлено. 2. После прохождения процедуры Resheto никакой надобности в полном массиве уже нет, дальше мы имеем дело только с выбранными простыми числами. Поэтому в процедуре Resheto формируется массив найденных простых чисел длиной m и с ним продолжается работа. 3. Поиск инверсного троичного кода целесообразно проводить прямо в теле процедуры преобразования, в том же цикле, в котором формируется прямой код. В результате формируются два числовых (а не строковых!) массива, содержащие запись простых чисел в прямом и инвертированном троичном коде. Надобность в типе mas_ch, таким образом, отпадает. Ну вот как-то так. Если будут вопросы - буду рад ответить. Код:
program zadacha_1; uses crt; const Nmax=100; type chisla=array[1..Nmax] of Integer; var n,m:integer; sim,sim_3,sim_3_r:chisla; procedure resheto(n_r:integer; var sim_r:chisla; var m_r:integer); {поиск простых чисел с применением решета Эратосфена} var i,j,p:integer; sim1:chisla; begin p:=1; for i:=1 to n_r do sim1[i]:=i; for i:=1 to n_r do begin if sim1[i]<>0 then inc(p); j:=i; while j<=n_r do if (sim1[j] mod p = 0) and (sim1[j]>p) then begin sim1[j]:=0; inc(j); end else inc(j); end; sim1[1]:=0; writeln('Simple numbers:'); m_r:=0; for i:=1 to n_r do if sim1[i]<>0 then begin Inc(m_r); sim_r[m_r]:=sim1[i]; write(sim_r[m_r],' '); end; WriteLn; end; procedure trancf(m_t:integer; sim_t:chisla; var sim_tr, sim_tr_rev:chisla); {перевод найденных простых чисел в троичную систему и инверсия} var i,j,num,Code:integer; s,r,st:string; cchh:Array[1..10] of Char; x:Array[1..Nmax] of Integer; begin for i:=1 to m_t do begin num:=sim_t[i]; s:=''; r:=''; x[i]:=0; Repeat Inc(x[i]); Str((num mod 3),st); cchh[x[i]]:=st[1]; num:=num div 3; Until num=0; for j:=x[i] downto 1 do s:=s+cchh[j]; for j:=1 to x[i] do r:=r+cchh[j]; VAL(s,sim_tr[i],Code); VAL(r,sim_tr_rev[i],Code); WriteLn(sim_t[i]:5,' ',sim_tr[i]:10,' ',sim_tr_rev[i]:10); end; WriteLn; end; procedure twins(m_t:integer; s_t,s_3,s_3_r:chisla); {поиск пар-близнецов по условию задачи} var i:integer; begin writeln('Twins simple numbers: '); for i:=1 to m_t-1 do If s_3_r[i]=s_3[i+1] then writeln(s_t[i],' (',s_3[i],') - ',s_t[i+1],' (',s_3[i+1],')'); end; BEGIN clrscr; write('13<n<=',Nmax,': '); readln(n); resheto(n,sim,m); writeln; trancf(m,sim,sim_3,sim_3_r); writeln; twins(m,sim,sim_3,sim_3_r); readkey; END. |
29.11.2010, 19:27 | #5 (permalink) |
Новичок
Регистрация: 28.11.2010
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
огромнейшее спасибо)))
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|