• Правильная дробь называется интересной, если после вычеркивания в числителе и знаменателе всех одинаковых цифр ее значение не изменяется. Например, интересной будет дробь [tex]\frac{49}{98}=\frac48[/tex], дробь [tex]\frac{12}{121}[/tex] интересной не является. Вывести на экран все интересные дроби, знаменатель которых не превосходит 500. (Pascal ABC)

Ответы 5

  • Мягко говоря, "не очень". Как Вы объясните дубликаты во фрагменте выдачи по Вашей программе - я запустил её, не поленился 10/500 = 1/5010/500 = 1/5011/11 = 1/111/11 = 1/111/11 = 1/111/11 = 1/111/110 = 1/1011/110 = 1/1011/110 = 1/1011/110 = 1/10
  • Все пояснения по этой задаче дал автору вопроса в лс
    • Автор:

      mateymzau
    • 6 лет назад
    • 0
  • Это здорово, но кому, как не Вам знать, что в архив задача и решение пойдут именно в таком виде, а Ваши объяснения в ЛС останутся тайной для того, кто захочет воспользоваться поиском...
  • UPDATE. P.S: с условием вывода уникальных строк производительность, разумеется, теряется
    • Автор:

      nelson
    • 6 лет назад
    • 0
  • var i, j, lensi, lensj, k, z, ni, nj, p: integer; // i - числитель числа, j - знаменатель числа, k, z - счетчики циклов; lensi - длина числителя (двухзначный или трехзначный); lensj - длина знаменателя (двухзначный или трехзначный); ni и nj - числитель и знаменатели нового числа (например, было 48/98. вычеркнули 8 и 8, получилось 4/9, где ni = 4, а nj = 9); p - индекс массиваnewd, rez: real; // rez - здесь хранится результат деления числителя на знаменатель; newd - здесь хранится результат деления числителя на знаменатель при условии, что вычеркнуты цифры в rezA, B, si, sj, nis, njs: string; // A, B, si, sj - временные переменные для хранения числителя и знаменателя в формате строк; nis, njs - переменные для хранения НОВОГО числителя и знаменателя в формате строк; W - просто строка, выводящая результатW: array[1..10000] of string; // массив, сравнивающий строки для вывода уникальныхbeginp := 2;for i := 10 to 500 do // начало цикла, перебирающего все числа до числа 500/500for j := 10 to 500 do beginrez := i / j; // здесь хранится значение деления, грубо говоря тут 49/98 (по примеру)si := IntToStr( i ); // конвертируем числитель в строковый формат, чтобы было удобнее работать с отдельными его цифрамиsj := IntToStr( j ); // аналогично, только со знаменателемlensi := length( si ); // узнаем длину числителя (может быть 2 или 3 - в зависимости от количества разрядов)lensj := length( sj ); // аналогично, только со знаменателемA := si; // создаем временные переменные, чтобы "вырезать" цифрыB := sj;for k := 1 to lensi do // цикл сравнивания текущей цифры числителя с текущей цифрой знаменателяfor z := 1 to lensj dobeginnis := si;njs := sj;if ( A[ k ] = B[ z ] ) then begin // если цифра в числителе равна цифре в знаменателеDelete( nis, k, 1 ); // то она вычеркивается в числителеDelete( njs, z, 1 ); // и вычеркивается в знаменателеni := StrToInt( nis ); // новое число уже БЕЗ одинаковых цифр цифрnj := StrToInt( njs );newd := ni / nj; // результат деления нового числа, грубо говоря тут 4/8 (по примеру)if ( newd = rez ) then begin // если результат деления числа равен результату деления нового числа (которые без одинаковых цифр), то выводим интересную дробьW[p] := IntToStr(i) + '/' + IntToStr(j) + ' = ' + IntToStr(ni) + '/' + IntToStr(nj);if ( W[p] <> W[p - 1] ) then begin writeln(W[p]);inc(p);end;end;end;end;end;end.
  • Добавить свой ответ

Еще вопросы

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years