есть ошибка в условии "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.
Yevgeny
23.01.2008 2:00
а что это прога именно делает? ну, или должна делать...
лоен
23.01.2008 2:08
значит так, если есть простые числа в каждой строке, которые содержат цифру 3, то заменить числа на главной диагонали на наибольшие числа соотвествующего столбца
klem4
23.01.2008 2:28
прогу не запускал, на счет синтаксических не знаю, но
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, что может вызвать выход за границы массива
Client
23.01.2008 14:06
Процедура 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.
Если будет ошибка, скажешь где и какая именно
volvo
23.01.2008 14:35
Несколько мыслей вслух: во-первых, насчет реализации Simple_number: не надо пробегать от 2 до (A div 2), достаточно - до trunc(sqrt(A)), будет быстрее... Постоянное переприсваивание Simple_number то в True, то в False тоже не улучшает читабельность программы, вполне достаточно вначале присвоить значению функции False, а в самом конце - True, как это и сделано, скажем, здесь: Замечательные числа (функция isPrime)
Теперь еще одно: Client, как ты думаешь, что будет проще и быстрее, сначала проверить число на простоту и потом смотреть, есть ли в его записи цифра 3, или наоборот, сначала проверить, есть ли тройка и только потом, если она есть, проверять на простоту? Я бы, наверное, выбрал второй вариант все-таки...
P.s. В exist_3, кстати, тоже лишние переприсваивания true/false, не надо загромождать программу лишними действиями...
Client
24.01.2008 1:17
Цитата
Я бы, наверное, выбрал второй вариант все-таки...
у меня как раз эти идеи были, но в выложенном коде подправил то что есть, чтоб (может быть) автору было понятнее, а если он потом хочет упростить, то пусть делает уже сам
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.