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<2thenbegin
Simple_number:=False;
Exit;
End;
Simple_number:=True;
b:= trunc(sqrt(A));
For d:=2to b dobeginIf (A mod d)=0thenbegin
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>0dobegin
p:=q mod10;
If p=3thenbegin
exist_3:=True;
Exit;
End;
q:=q div10;
End;
End;
Procedure Change(Var A:Matrix; n:IndexType);
Var i,j :IndexType;
max :Longint;
Begin
max:=low(Longint);
j:=1;
While j<=n dobeginFor i:=1to n dobeginIf A[i,j]>max then max:=A[i,j];
End;
A[j,j]:=max;
inc(j);
End;
End;
ProcedureOut(A:Matrix; n:IndexType);
Var i,j :IndexType;
Begin
Writeln;
For i:=1to n dobeginFor j:=1to n do write(A[i,j]);
Write(#10#13,#10#13);
End;
End;
Var A :Matrix;
i,j,n,m :Integer;
count :Word;
BeginRepeat
Write('Vvedite parametri matrici(n<100)');
Read(n);
m:=n;
Writeln('Matrix:');
Until (n>=1) and (n<=Nmax);
For i:=1to n dobeginFor j:=1to n do Read(A[i,j]);
End;
count:=0;
For j:=1to n dobeginFor i:=1to n do Simple_number(A[i,j]);
If Simple_number(A[i,j]) thenbegin
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])) thenbegin
Change(A,n);
end;
for i:=1to n dobeginfor j:=1to n do write(a[i,j]:5);
writeln;
end;
readln;
End.
значит так, если есть простые числа в каждой строке, которые содержат цифру 3, то заменить числа на главной диагонали на наибольшие числа соотвествующего столбца
прогу не запускал, на счет синтаксических не знаю, но
For j:=1to n dobeginFor i:=1to n do Simple_number(A[i,j]); // < ---------- непонятно зачем вызываешь в цикле для для всех элементов
If Simple_number(A[i,j]) thenbegin// а проверяешь значение только для посл. элемента столбца
тут ты мне кажется что-то напутал, фактически ты вызываешь функцию чтобы что-то проверить только для каждого последнего элемента в каждом столбце.
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<2thenbegin
Simple_number:=False;
Exit;
End;
Simple_number:=True;
b:=A div2;
For d:=2to b dobeginIf (A mod d)=0thenbegin
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>0dobegin
p:=q mod10;
If p=3thenbegin
exist_3:=True;
Exit;
End;
q:=q div10;
End;
End;
Procedure Change(Var A:Matrix; n:IndexType);
Var i,j :IndexType;
max :Longint;
Beginfor i:=1to n dobegin
max:=a[1,i];
For j:=1to n dobeginIf A[j,i]>max then max:=A[j,i];
End;
A[i,i]:=max;
End;
End;
ProcedureOut(A:Matrix; n:IndexType);
Var i,j :IndexType;
Begin
Writeln;
For i:=1to n dobeginFor j:=1to n do write(A[i,j]);
Writeln;
End;
End;
Var A :Matrix;
i,j,n,m :Integer;
count :Word;
BeginRepeat
Write('Vvedite parametri matrici(n<100)');
Read(n);
m:=n;
Writeln('Matrix:');
Until (n>=1) and (n<=Nmax);
For i:=1to n dobeginFor j:=1to n do Read(A[i,j]);
End;
count:=0;
i:=1;
while i<=n dobegin
j:=1;
while j<=n dobeginIf Simple_number(A[i,j]) thenIf exist_3(A[i,j]) thenbegin
inc(count);
j:=n
end;
inc(j)
End;
inc(i)
End;
If count=m then Change(A,n);
for i:=1to n dobeginfor j:=1to 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, не надо загромождать программу лишними действиями...
у меня как раз эти идеи были, но в выложенном коде подправил то что есть, чтоб (может быть) автору было понятнее, а если он потом хочет упростить, то пусть делает уже сам