Как считать десятичную дробь в виде числителя и знаменателя?
Код в большинстве случаев работает, но при считывании дробей с лидирующими нулями в дробной части получается неправильно: 1.01 превращается в 11/10 вместо 101/100.
#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 - надо обработать как целое число). И заодно покажу финт с выводом через звёздочку.
#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