Как считать десятичную дробь в виде числителя и знаменателя?

Код в большинстве случаев работает, но при считывании дробей с лидирующими нулями в дробной части получается неправильно: 1.01 превращается в 11/10 вместо 101/100.

tio.run

#include <cstdio>

int main()
{
  unsigned long long x, y, nom, den;

  scanf("%llu.%llu", &x, &(y=0));
  for (den=1; den<=y; den*=10);
  nom = x * den + y;
  
  printf("%llu / %llu\n", nom, den);

  return 0;
}
1.01
11 / 10

Ответы (1 шт):

Автор решения: Qwertiy

Для дробной части надо считать не только число, но и позиции его начала и конца - тогда из их разности можно будет получить правильный знаменатель (если точки нет, то scanf вернёт 1 - надо обработать как целое число). И заодно покажу финт с выводом через звёздочку.

tio.run

#include <cstdio>

int main()
{
  unsigned long long x, y, nom, den;
  int s, e, len;

  switch (scanf("%llu.%n%llu%n", &x, &s, &y, &e))
  {
    case 1:    e = s, y = 0;
    case 2:    break;
    default:   return 1;
  }

  len = e - s;
  for (den=1; s<e; ++s) den *= 10;
  nom = x * den + y;
  
  printf("%llu / %llu\n", nom, den);
  printf("%llu.%0*llu\n", x, len, y);

  return 0;
}
1.01
101 / 100
1.01
→ Ссылка