1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
есть ошибка в условии "If Simple_number", пытался исправить, но видимо неверно. помогите исправить)
Const Nmax=100; Type IndexType=1..Nmax; Matrix=Array[IndexType,IndexType] of Longint; Function Simple_number(A:Longint): Boolean; Var d,b : Word; Begin A:=Abs(A); If A<2 then begin Simple_number:=False; Exit; End; Simple_number:=True; b:= trunc(sqrt(A)); For d:=2 to b do begin If (A mod d)=0 then begin Simple_number:=False; break; End; End; End; Function exist_3(A:Longint): Boolean; Var q,p :Longint; Begin A:=Abs(A); q:=A; exist_3:=False; While q>0 do begin p:=q mod 10; If p=3 then begin exist_3:=True; Exit; End; q:=q div 10; End; End; Procedure Change(Var A:Matrix; n:IndexType); Var i,j :IndexType; max :Longint;
Begin max:=low(Longint); j:=1; While j<=n do begin For i:=1 to n do begin If A[i,j]>max then max:=A[i,j]; End; A[j,j]:=max; inc(j); End; End; Procedure Out(A:Matrix; n:IndexType); Var i,j :IndexType; Begin Writeln; For i:=1 to n do begin For j:=1 to n do write(A[i,j]); Write(#10#13,#10#13); End; End;
Var A :Matrix; i,j,n,m :Integer; count :Word; Begin Repeat Write('Vvedite parametri matrici(n<100)'); Read(n); m:=n; Writeln('Matrix:'); Until (n>=1) and (n<=Nmax); For i:=1 to n do begin For j:=1 to n do Read(A[i,j]); End; count:=0; For j:=1 to n do begin For i:=1 to n do Simple_number(A[i,j]); If Simple_number(A[i,j]) then begin exist_3(A[i,j]); If exist_3(A[i,j]) then inc(count); End; End; If (count=m) and (exist_3(A[i,j])) then begin Change(A,n); end; for i:=1 to n do begin for j:=1 to n do write(a[i,j]:5); writeln; end; readln; End.
значит так, если есть простые числа в каждой строке, которые содержат цифру 3, то заменить числа на главной диагонали на наибольшие числа соотвествующего столбца
прогу не запускал, на счет синтаксических не знаю, но
For j:=1 to n do begin For i:=1 to n do Simple_number(A[i,j]); // < ---------- непонятно зачем вызываешь в цикле для для всех элементов If Simple_number(A[i,j]) then begin // а проверяешь значение только для посл. элемента столбца
тут ты мне кажется что-то напутал, фактически ты вызываешь функцию чтобы что-то проверить только для каждого последнего элемента в каждом столбце.
UPDATE
кстати, я не уверен, но могу допустить что после цикла for по i, это самое i будет больше N, что может вызвать выход за границы массива
Сообщение отредактировано: klem4 -
--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
Процедура Change не правильная, совсем не понятно то, о чем уже сказал klem4.
Write(#10#13,#10#13);
А не проще написать
writeln;
If (count=m) and (exist_3(A[i,j]))
А вот здесь странно, т.к. если в массиве 3х3 будет 4 простых элементов, то это уже не сработает, да тут еще
and (exist_3(A[i,j]))
, что вообщем не правильно... Подправил твой код, подучилось так
Const Nmax=5; Type IndexType=1..Nmax; Matrix=Array[IndexType,IndexType] of Longint; Function Simple_number(A:Longint): Boolean; Var d,b : Word; Begin A:=Abs(A); If A<2 then begin Simple_number:=False; Exit; End; Simple_number:=True; b:=A div 2; For d:=2 to b do begin If (A mod d)=0 then begin Simple_number:=False; break; End; End; End; Function exist_3(A:Longint): Boolean; Var q,p :Longint; Begin A:=Abs(A); q:=A; exist_3:=False; While q>0 do begin p:=q mod 10; If p=3 then begin exist_3:=True; Exit; End; q:=q div 10; End; End; Procedure Change(Var A:Matrix; n:IndexType); Var i,j :IndexType; max :Longint;
Begin for i:=1 to n do begin max:=a[1,i]; For j:=1 to n do begin If A[j,i]>max then max:=A[j,i]; End; A[i,i]:=max; End; End; Procedure Out(A:Matrix; n:IndexType); Var i,j :IndexType; Begin Writeln; For i:=1 to n do begin For j:=1 to n do write(A[i,j]); Writeln; End; End;
Var A :Matrix; i,j,n,m :Integer; count :Word; Begin Repeat Write('Vvedite parametri matrici(n<100)'); Read(n); m:=n; Writeln('Matrix:'); Until (n>=1) and (n<=Nmax); For i:=1 to n do begin For j:=1 to n do Read(A[i,j]); End; count:=0; i:=1; while i<=n do begin j:=1; while j<=n do begin If Simple_number(A[i,j]) then If exist_3(A[i,j]) then begin inc(count); j:=n end; inc(j) End; inc(i) End; If count=m then Change(A,n); for i:=1 to n do begin for j:=1 to n do write(a[i,j]:5); writeln; end; readln; End.
Несколько мыслей вслух: во-первых, насчет реализации Simple_number: не надо пробегать от 2 до (A div 2), достаточно - до trunc(sqrt(A)), будет быстрее... Постоянное переприсваивание Simple_number то в True, то в False тоже не улучшает читабельность программы, вполне достаточно вначале присвоить значению функции False, а в самом конце - True, как это и сделано, скажем, здесь: Замечательные числа (функция isPrime)
Теперь еще одно: Client, как ты думаешь, что будет проще и быстрее, сначала проверить число на простоту и потом смотреть, есть ли в его записи цифра 3, или наоборот, сначала проверить, есть ли тройка и только потом, если она есть, проверять на простоту? Я бы, наверное, выбрал второй вариант все-таки...
P.s. В exist_3, кстати, тоже лишние переприсваивания true/false, не надо загромождать программу лишними действиями...
у меня как раз эти идеи были, но в выложенном коде подправил то что есть, чтоб (может быть) автору было понятнее, а если он потом хочет упростить, то пусть делает уже сам