#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int euclid_gcd(int a, int b) {
if (b == 0) return a;
return euclid_gcd(b, a % b);
}
void reducesimple(char *buf,
int integer,
const char *floating)
{
int scale = 1;
int gcd;
int decimal;
while (flen--) scale *= 10;
decimal
= atoi(floating
); gcd = euclid_gcd(decimal, scale);
sprintf(buf
, "%d + %d/%d", integer
, decimal
/ gcd
, scale
/ gcd
); }
void reducerational(char *buf,
int numerator,
int denominator)
{
int whole = numerator / denominator;
int rest = numerator % denominator;
int gcd = euclid_gcd(rest, denominator);
if (!whole) {
sprintf(buf
, "%d/%d", rest
/ gcd
, denominator
/ gcd
); } else {
sprintf(buf
, "%d + %d/%d", whole
, rest
/ gcd
, denominator
/ gcd
); }
}
void reducerepeating(char *buf,
int integer,
const char *floating,
const char *repeating)
{
int flen, rlen;
int num = 1, den = 1;
int gcd;
int fscale = 1, rscale = 9;
int part1, part2;
while (--rlen) { rscale *= 10; rscale += 9; }
while (flen--) rscale *= 10;
while (flen--) fscale *= 10;
num = part1 * rscale + fscale * part2;
den = fscale * rscale;
gcd = euclid_gcd(num, den);
sprintf(buf
, "%d + %d / %d", integer
, num
/ gcd
, den
/ gcd
); }
void reduce(char *buf, const char *expression) {
int chk1, chk2, chk3, chk4;
int integer, numerator, denominator;
char floating[11], repeating[11];
chk1
= sscanf(expression
, "%d.%10[0123456789]", &integer
, floating
); chk2
= sscanf(expression
, "%d/%d", &numerator
, &denominator
); chk3
= sscanf(expression
, "%d.%10[0123456789](%10[0123456789])", &integer
, floating
, repeating
); chk4
= sscanf(expression
, "%d.(%10[0123456789])", &integer
, repeating
); if ((chk3 == 3) || (chk4 == 2)) {
if (chk4 == 2) *floating = 0;
reducerepeating(buf, integer, floating, repeating);
} else {
if (chk2 == 2) {
reducerational(buf, numerator, denominator);
} else {
if (chk1 == 2) {
reducesimple(buf, integer, floating);
} else {
strcpy(buf
, "invalid expression"); }
}
}
}
int main(void) {
char buf[1000], src[1000];
while (fgets(src
, sizeof src
, stdin
)) { reduce(buf, src);
printf("%s ==> %s\n", src
, buf
); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKaW50IGV1Y2xpZF9nY2QoaW50IGEsIGludCBiKSB7CiAgaWYgKGIgPT0gMCkgcmV0dXJuIGE7CiAgcmV0dXJuIGV1Y2xpZF9nY2QoYiwgYSAlIGIpOwp9Cgp2b2lkIHJlZHVjZXNpbXBsZShjaGFyICpidWYsCiAgICAgICAgICAgICAgICAgIGludCBpbnRlZ2VyLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbG9hdGluZykKewogIGludCBmbGVuID0gc3RybGVuKGZsb2F0aW5nKTsKICBpbnQgc2NhbGUgPSAxOwogIGludCBnY2Q7CiAgaW50IGRlY2ltYWw7CiAgd2hpbGUgKGZsZW4tLSkgc2NhbGUgKj0gMTA7CiAgZGVjaW1hbCA9IGF0b2koZmxvYXRpbmcpOwogIGdjZCA9IGV1Y2xpZF9nY2QoZGVjaW1hbCwgc2NhbGUpOwogIHNwcmludGYoYnVmLCAiJWQgKyAlZC8lZCIsIGludGVnZXIsIGRlY2ltYWwgLyBnY2QsIHNjYWxlIC8gZ2NkKTsKfQoKdm9pZCByZWR1Y2VyYXRpb25hbChjaGFyICpidWYsCiAgICAgICAgICAgICAgICAgICAgaW50IG51bWVyYXRvciwKICAgICAgICAgICAgICAgICAgICBpbnQgZGVub21pbmF0b3IpCnsKICBpbnQgd2hvbGUgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjsKICBpbnQgcmVzdCA9IG51bWVyYXRvciAlIGRlbm9taW5hdG9yOwogIGludCBnY2QgPSBldWNsaWRfZ2NkKHJlc3QsIGRlbm9taW5hdG9yKTsKICBpZiAoIXdob2xlKSB7CiAgICBzcHJpbnRmKGJ1ZiwgIiVkLyVkIiwgcmVzdCAvIGdjZCwgZGVub21pbmF0b3IgLyBnY2QpOwogIH0gZWxzZSB7CiAgICBzcHJpbnRmKGJ1ZiwgIiVkICsgJWQvJWQiLCB3aG9sZSwgcmVzdCAvIGdjZCwgZGVub21pbmF0b3IgLyBnY2QpOwogIH0KfQoKdm9pZCByZWR1Y2VyZXBlYXRpbmcoY2hhciAqYnVmLAogICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZWdlciwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmxvYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlcGVhdGluZykKewogIGludCBmbGVuLCBybGVuOwogIGludCBudW0gPSAxLCBkZW4gPSAxOwogIGludCBnY2Q7CiAgaW50IGZzY2FsZSA9IDEsIHJzY2FsZSA9IDk7CiAgaW50IHBhcnQxLCBwYXJ0MjsKCiAgcGFydDEgPSBhdG9pKGZsb2F0aW5nKTsKICBwYXJ0MiA9IGF0b2kocmVwZWF0aW5nKTsKCiAgcmxlbiA9IHN0cmxlbihyZXBlYXRpbmcpOwogIHdoaWxlICgtLXJsZW4pIHsgcnNjYWxlICo9IDEwOyByc2NhbGUgKz0gOTsgfQogIGZsZW4gPSBzdHJsZW4oZmxvYXRpbmcpOwogIHdoaWxlIChmbGVuLS0pIHJzY2FsZSAqPSAxMDsKICBmbGVuID0gc3RybGVuKGZsb2F0aW5nKTsKICB3aGlsZSAoZmxlbi0tKSBmc2NhbGUgKj0gMTA7CgogIG51bSA9IHBhcnQxICogcnNjYWxlICsgZnNjYWxlICogcGFydDI7CiAgZGVuID0gZnNjYWxlICogcnNjYWxlOwogIGdjZCA9IGV1Y2xpZF9nY2QobnVtLCBkZW4pOwogIHNwcmludGYoYnVmLCAiJWQgKyAlZCAvICVkIiwgaW50ZWdlciwgbnVtIC8gZ2NkLCBkZW4gLyBnY2QpOwp9Cgp2b2lkIHJlZHVjZShjaGFyICpidWYsIGNvbnN0IGNoYXIgKmV4cHJlc3Npb24pIHsKICBpbnQgY2hrMSwgY2hrMiwgY2hrMywgY2hrNDsKICBpbnQgaW50ZWdlciwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKICBjaGFyIGZsb2F0aW5nWzExXSwgcmVwZWF0aW5nWzExXTsKCiAgY2hrMSA9IHNzY2FuZihleHByZXNzaW9uLCAiJWQuJTEwWzAxMjM0NTY3ODldIiwgJmludGVnZXIsIGZsb2F0aW5nKTsKICBjaGsyID0gc3NjYW5mKGV4cHJlc3Npb24sICIlZC8lZCIsICZudW1lcmF0b3IsICZkZW5vbWluYXRvcik7CiAgY2hrMyA9IHNzY2FuZihleHByZXNzaW9uLCAiJWQuJTEwWzAxMjM0NTY3ODldKCUxMFswMTIzNDU2Nzg5XSkiLCAmaW50ZWdlciwgZmxvYXRpbmcsIHJlcGVhdGluZyk7CiAgY2hrNCA9IHNzY2FuZihleHByZXNzaW9uLCAiJWQuKCUxMFswMTIzNDU2Nzg5XSkiLCAmaW50ZWdlciwgcmVwZWF0aW5nKTsKICBpZiAoKGNoazMgPT0gMykgfHwgKGNoazQgPT0gMikpIHsKICAgIGlmIChjaGs0ID09IDIpICpmbG9hdGluZyA9IDA7CiAgICByZWR1Y2VyZXBlYXRpbmcoYnVmLCBpbnRlZ2VyLCBmbG9hdGluZywgcmVwZWF0aW5nKTsKICB9IGVsc2UgewogICAgaWYgKGNoazIgPT0gMikgewogICAgICByZWR1Y2VyYXRpb25hbChidWYsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNoazEgPT0gMikgewogICAgICAgIHJlZHVjZXNpbXBsZShidWYsIGludGVnZXIsIGZsb2F0aW5nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJjcHkoYnVmLCAiaW52YWxpZCBleHByZXNzaW9uIik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmludCBtYWluKHZvaWQpIHsKICBjaGFyIGJ1ZlsxMDAwXSwgc3JjWzEwMDBdOwogIHdoaWxlIChmZ2V0cyhzcmMsIHNpemVvZiBzcmMsIHN0ZGluKSkgewogICAgc3JjW3N0cmxlbihzcmMpIC0gMV0gPSAwOwogICAgcmVkdWNlKGJ1Ziwgc3JjKTsKICAgIHByaW50ZigiJXMgPT0+ICVzXG4iLCBzcmMsIGJ1Zik7CiAgfQogIHJldHVybiAwOwp9