B. 这是数学题还是字符串题呢?

来源:互联网 发布:北京市道路网数据下载 编辑:程序博客网 时间:2024/06/08 12:27

B. 这是数学题还是字符串题呢?

众所周知的分数化成小数是如此的easy,那么小数化成分数呢!
已知小数分为不循环小数和循环小数,而循环小数又分为混循环小数和纯循环小数两类。
提示:
1、纯循环小数(类似0.’3’,引号内为循环的数):用9做分母,有多少个循环数就几个9,以此类推。
2、混循环小数(类似0.2’33’,引号内为循环的数):用9和0做分母,首先有一个循环节有几位数字就几个9,接着有几个没加入循环的数就加几个0,再用第二个循环节以前的小数部分组成的数与小数部分中不循环部分组成的数的差做分子,比如0.4’3’,3的循环,有一位数没加入循环,就在9后面加一个0做分母,再用43减4做分子,得 90分之39,0.14’5’,5的循环就用9后面加2个0做分母,再用145减14做分子,得900分之131,0.549,49的循环,就 用99后面加1个0做分母,用549减5做分子,最后得990分之545,以此类推,能约分的要化简。

Input
输入的第一行是一个T,T大约为50组,接下来有T组数据,每组数据占一行,数据为非负且小于1的小数,输入包含”.”,”(“和”)”,括号中是小数无限循环的部分。

这个分母的范围不会超过10^19。

Output
输出它的分数形式,占一行。

Sample Input
3
0.5
0.(3)
0.2(33)
Sample Output
1/2
1/3
7/30

简单模拟

本来题目,有坑叫学长改过了,

#include<iostream>#include<cstdlib>#include<cstring>#include<cmath>#include<cctype>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;#define mm(a,b) memset(a,0,sizeof(a))ll gcd(ll x, ll y){    return x%y == 0 ? y : gcd(y, x%y);}char a[100], b[100], c[100];int main(){    int t;    cin >> t;    getchar();    while (t--)    {        mm(a, 0);        mm(b, 0);        mm(c, 0);        ll k1 = 0, k2 = 0;        gets(a);        int len = strlen(a);        //cout << strlen(a) << "&&&&" << endl;        if (strlen(a) == 1)        {            puts("0");            continue;        }        int flag = 0;        for (ll i = 0; i < strlen(a); i++)        {            if (i >= 2)            {                if (a[i] >= '0'&&a[i] <= '9')                {                    if (!flag)                        b[k1++] = a[i];                    else                        c[k2++] = a[i];                }                else flag = 1;            }        }        //cout << s1 << "((((" << s2 << endl;        if (!flag)        {            ll s1 = atol(b), s2 = atol(c);            ll s3 = pow(10, strlen(a) - 2);            //cout << strlen(a)-2 << "&&&&" << endl;            //cout << s3 << "UUUU" << endl;            ll tt = gcd(s1, s3);            //  cout << tt;            printf("%lld/%lld\n", s1 / tt, s3 / tt);        }        else        {            if (a[2] == '(')            {                ll s2 = pow(10, len - 4) - 1;                ll s1 = atol(c);                ll tt = gcd(s1, s2);                printf("%lld/%lld\n", s1 / tt, s2 / tt);            }            else            {                ll s2 = pow(10, len - 4) - pow(10, strlen(b));                ll aa = atol(b);                strcat(b, c);                ll bb = atol(b);                ll s1 = bb - aa;                //cout << s1 << "s1" << "s2" << s2 << endl;                ll tt = gcd(s1, s2);                printf("%lld/%lld\n", s1 / tt, s2 / tt);            }        }    }    return 0;}
原创粉丝点击