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

Тема в разделе "Pascal and Delphi", создана пользователем sestrenka141989, 6 апр 2010.

Статус темы:
Закрыта.
  1. sestrenka141989

    sestrenka141989 Гость

    Репутация:
    0
    вот условие задачки:

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

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

    Код (Delphi):
    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);
    и вот тут загвоздка(((( не знаю как найти максимальное число
    я начинала писать так:

    Код (Delphi):
    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. ????

    ???? Гость

    Репутация:
    0
    начинай с (суммы цифр - 1) и спускайся до 1
    что-то типа

    Код (Delphi):
    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 паскалем почти не знаком, это просто алгоритм написанный на коленке.
     
  3. hosm

    hosm * so what *

    Репутация:
    0
    Регистрация:
    18 май 2009
    Сообщения:
    2.445
    Симпатии:
    8
    ????
    а почему не взять сразу for i := (sum+1) div 2 downto 2 do?

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

    sestrenka141989 Гость

    Репутация:
    0
    Ну если судить по примеру то M<>N
     
  5. ????

    ???? Гость

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

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

    hosm * so what *

    Репутация:
    0
    Регистрация:
    18 май 2009
    Сообщения:
    2.445
    Симпатии:
    8
    ????, да тут не знание Паскаля имелось в виду, я ж не придиралась там к to/downto или лишнему декременту счетчика цикла...
    там суть коммента такая: логичное предположение о том, что максимальный делитель получится либо при делении sum на 2 (если число sum делится на 2), либо будет меньше целой части от деления числа sum на 2 (ну, в частности, будет равен 1, если других искомых делителей нет), поэтому в общем случае просматривать от sum -1 не совсем рационально (неэффективно).
    Ну, в общем, нужно нечто подобное такому:
    Код (Delphi):
    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);
    просто вчера не было времени описать нормально (
     
  7. ????

    ???? Гость

    Репутация:
    0
    логично :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей