Помощь - Поиск - Пользователи - Календарь
Полная версия: задачка с числами)помогите хоть чем-то
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Vikusik93
на интервале чисел для нечетных чисел найти средние арифметические четных и нечетных цифр, для четных определить числа с максимальной цифрой в четном разряде
Lapp
Цитата(Vikusik93 @ 15.02.2012 19:06) *
на интервале чисел для нечетных чисел найти средние арифметические четных и нечетных цифр, для четных определить числа с максимальной цифрой в четном разряде

Викусик, спасибо за задачку ). Лови решение.

var
  i: integer;
  a,b,d,j,m,k: longint;
  s,n: array[0..1] of longint;

const
  EvenOdd: array[0..1] of string= ('even','odd');

begin
  writeln('please enter limits of the interval');
  write('  lower: ');
  readln(a);
  write('  upper: ');
  readln(b);
  m:= 0;
  s[0]:= 0;
  s[1]:= 0;
  n[0]:= 0;
  n[1]:= 0;
  for i:=a to b do begin
    j:= i;
    if Odd(i) then
      while j>0 do begin
        d:= j mod 10;
        k:= d mod 2;
        inc(s[k],d);
        inc(n[k]);
        j:= j div 10
      end
    else
      while j>0 do begin
        d:= j mod 10;
        if d>m then m:= d;
        j:= j div 100
      end
  end;

  writeln('for odd numbers:');
  for i:=0 to 1 do
    if n[i]=0 then
      writeln('  no ',EvenOdd[i],' digits encountered')
    else
      writeln('  average of ',EvenOdd[i],' digits is ',s[i]/n[i]:8:6);
  writeln('for even nubers:');
  writeln('  max digit in even position is ',m);
  writeln('  numbers which have ',m,' in an even position:');
  for i:=a to b do begin
    j:= i;
    if not Odd(i) then
      while j>0 do begin
        if j mod 10=m then begin
          write(i:8);
          break
        end;
        j:= j div 100
      end
  end;
  readln
end.

У меня только возник по пути вопрос: c какого разряда начинать - с нулевого или с первого? Я считал, что самый правый разряд имеет номер 0 (то есть четный). Если надо иначе, а также если что-то неясно - говори smile.gif.
Vikusik93
Можно блок-схему)чтобы понять)
Lapp
Цитата(Vikusik93 @ 22.02.2012 12:00) *

Можно блок-схему)чтобы понять)

Okay. Набросаю чуть позже (вечерком).
Только я не умею их рисовать. То есть обозначений не знаю..
И с уровнем подробности неясно.. Но я все же попробую.

Слушай, Вик, а ты не можешь просто сказать, в каком месте у тебя происходит затык? Я бы тогда на словах тоже объяснил. Как думаешь?
Lapp
Викуська, заломало меня рисовать квадратики, прости уж.. Более того - я сильно сомневаюсь, что блок-схема тут поможет пониманию (ей-ей!). Думаю, даже твой преп это понимает, так что если это он просил бл-сх (в чем я почти не сомневаюсь)), то все же попробуй втюхать ему, что это для его же блага ты ее не стала рисовать smile.gif. Если ты и правда хочешь разобраться и понять (что бывает с вашим братом нечасто)), то давай я тебе лучше комменты напишу, а? smile.gif

var
  i: integer;
  a,b,d,j,m,k: longint;
  s,n: array[0..1] of longint;   // s - суммы [четных, нечетных], n - количества [четных, нечетных] (при определении средних поделим одюно на другое)

const
  EvenOdd: array[0..1] of string= ('even','odd');  // это просто названия видов чисел, нужны для лучшей организации вывода результатов (переводится как ЧетныйНечетный)

begin
  writeln('please enter limits of the interval');
  write('  lower: ');
  readln(a);      // ввод нижней границы интервала чисел
  write('  upper: ');
  readln(b);      // ввод верхней границы интервала чисел
  m:= 0;      // это будет максимальная цифра (где надо)), пока обнуляем
  s[0]:= 0;    // тут и ниже обнуляем суммы и количества
  s[1]:= 0;
  n[0]:= 0;
  n[1]:= 0;
  for i:=a to b do begin    // цикл по всем числам интервала (главный цикл поиска и расчетов)
    j:= i;     // мы будем менять текущее значение цикла, а это нельзя, так что перекладываем в другую переменную
    if Odd(i) then       // обработка нечетных чисел по заданным условиям
      while j>0 do begin      // цикл определения цифр справа налево, пока число не обнулится
        d:= j mod 10;     // определение текущей цифры
        k:= d mod 2;     // тут k - это четность, то есть: k=0 при четном d и k=1 при нечетном d
        inc(s[k],d);    // увиличиваем нужную (четных или нечетных) сумму на найденную цифру
        inc(n[k]);     // увеличиваем нужное количество (четных или нечетных) цифр на 1
        j:= j div 10   // продвигаемся по чилсу на один разряд влево..
      end
    else
      while j>0 do begin   // обработка четных чисел
        d:= j mod 10;    // определение текущей цифры
        if d>m then m:= d;    // если текущая цифра больше найденного макимума - обновляем максимум
        j:= j div 100    // продвигаемся по числу влево, но теперь на ДВА разряда, т.к. нам нужны только четные разряды (0, 2, 4, 6, 8, 10, 12..)
      end
  end;
  // все рассчитано, надо только вывести результаты теперь ...
  writeln('for odd numbers:');    // ... для нечетных чисел
  for i:=0 to 1 do   // очень хитро*опый цикл вывода, для него нужен был массив EvenOdd
    if n[i]=0 then   // это тоже хитрость, которая позволяет избежать деления на ноль, если цифр какого-то вида не найдено совсем ))
      writeln('  no ',EvenOdd[i],' digits encountered')   // выводим, что не нашли цифр такого вида
    else    // а если найдено, то можно спокойно находить их среднее
      writeln('  average of ',EvenOdd[i],' digits is ',s[i]/n[i]:8:6);  // ку-ку, вот вам среднее! делим сумму на количество прямо при выводе
  writeln('for even nubers:');   // ... а теперь для четных чисел
  writeln('  max digit in even position is ',m);   // максимальная цифра в четной позиции такая-то..
  writeln('  numbers which have ',m,' in an even position:');   // .. и было их вот столько с этой цифрой в четном разряде
  // это все было просто..  а вот для вывода этих чисел придется снова проходить по интервалу..
  for i:=a to b do begin   // проходим заново
    j:= i;        // см. выше (чтобы издевательство над параметром цикла не помешали гладкому его течению, перекладываем значение)
    if not Odd(i) then     // если число четное
      while j>0 do begin      // цикл для определния циферок
        if j mod 10=m then begin      // а тут отклонение от того, что выше: если цифра равна найденному ранее максимуму...
          write(i:8);    // .. то выводим ее
          break   // идти дальше по разрядам нет смысла, да и вредно - можем случайно вывести число дважды или там трижды или больше раз, а нам это не надо вроде как
        end;
        j:= j div 100   // прдвигаемся по разрядам на два (по четным)
      end
  end;
  readln       // хорошо поработали, можно отдохнуть.. ))
end.

Вика, разбирайся )). Что неясно - спрашивай, не стесняйся.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.