помогите с програмкой

  • Автор темы sestrenka141989
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

sestrenka141989

#1
вот условие задачки:

Дано натуральное число N.Найти наибольшее число М(М>1)на которое сума цифр в цифровой записи числа N делится без остатка. Если такого числа нету вывести «no». Пример:N=12345, М=5. Сума цифр числа N равна 15, делится на 5

суму цифр числа я нахожу:

Код:
program max;
var m, n, k, i, sum, x: integer;
begin
writeln('введите число n');
readln(n);
k:=n;
sum:=0; i:=2;
while k<>0 do
begin
sum:=sum+(k mod 10);
k:=k div 10;
end;
writeln('sum=',sum);
и вот тут загвоздка(((( не знаю как найти максимальное число
я начинала писать так:

Код:
for i:=1 to n do
begin
if n mod i=0 then begin
x:=i;
break
else
i:=i+1;
end;
writeln(x);
readln
end.
но оно не работает((
 
?

????

#2
начинай с (суммы цифр - 1) и спускайся до 1
что-то типа

Код:
for i := sum-1 to 1 do
begin
if (sum mod i) = 0 then
break;

i := i - 1;
end;

if (i = 1)
writeln('no')
else
writeln(result);
PS. c паскалем почти не знаком, это просто алгоритм написанный на коленке.
 

hosm

* so what *
18.05.2009
2 442
6
#3
????
а почему не взять сразу for i := (sum+1) div 2 downto 2 do?

sestrenka141989
Задача поставлена не совсем корректно - забыли еще одно условие)
Если подойти формально и честно, максимальное число в изначальной постановке задачи - это и есть sum, ибо оно делится само на себя.
 
?

????

#5
????
а почему не взять сразу for i := (sum+1) div 2 downto 2 do?

т.к.
PS. c паскалем почти не знаком, это просто алгоритм написанный на коленке.
 

hosm

* so what *
18.05.2009
2 442
6
#6
????, да тут не знание Паскаля имелось в виду, я ж не придиралась там к to/downto или лишнему декременту счетчика цикла...
там суть коммента такая: логичное предположение о том, что максимальный делитель получится либо при делении sum на 2 (если число sum делится на 2), либо будет меньше целой части от деления числа sum на 2 (ну, в частности, будет равен 1, если других искомых делителей нет), поэтому в общем случае просматривать от sum -1 не совсем рационально (неэффективно).
Ну, в общем, нужно нечто подобное такому:
Код:
result := 1;
if sum>3 then // числа 1-3 - простые, не нужно проверять делители
for i := sum div 2 downto 2 do
if (sum mod i) = 0 then
begin
result := i;
break; // или если нет такого i:=2; т.е. цель-выйти из цикла
end;
if (result = 1)
writeln('no')
else
writeln(result);
просто вчера не было времени описать нормально (
 
Статус
Закрыто для дальнейших ответов.