hdu2.1.8

1 基本思路

将循环小数化为分数的思想:
0.3333……循环先把它*10再相减再/9即可得到1/3。
0.32(692307)先把它*100,得32.(692307)再*106 后减去32.(692307)再/(106-1)。
思想就是这样。
第一次自己没有看网上参考答案做下来的,虽是水题但还是挺激动的,写个解题报告记录下记录下吧:)

2 hdu 2.1.8 源码

#include <iostream>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
int gcd(int a, int b)
{
        if(b == 0) return a;
        return gcd(b, a%b );
}
int main(int argc, char *argv[])
{
        int n, i, j, k;         // i 表(位置 j表)位置 k表循环部分位数
        long long x, y, g;      // x做为分子 y做分母 g表示xy的最大公约数
        string str;
        while(cin>>n){
                while(n--){
                        cin>>str;
                        // 分为有循环部分和无循环部分
                        if(str.find("(") != string::npos){
                                i = str.find("(");
                                j = str.find(")");
                                k = j - i - 1;
                                if(i == 2){ // 有循环部分又分为循环部分前面有没有数字
                                        x = atoi(str.substr(i+1, j).c_str());
                                        y = pow((long double)10, (long double)k)-1;
                                        g = gcd(x, y);
                                }else{
                                        x = atoi(str.substr(2, i).c_str());
                                        y = atoi(str.substr(i+1, j).c_str());
                                        x = pow((long double)10, (long double)k)*x + y - x;
                                        y = pow((long double)10, (long double)(i-2))*(pow((long double)10, (long double)k)-1);
                                        g = gcd(x, y);
                                }
                        }else{
                                str = str.substr(2);
                                k = str.length();
                                x = atoi(str.c_str());
                                y = pow((long double)10, (long double)k);
                                g = gcd(x, y);
                        }
                        cout<<x/g<<"/"<<y/g<<endl;
                }
                
        }
        return 0;
}

Author: visaya fan <visayafan[AT]gmail.com>

Date: 2011-08-12 22:12:51

HTML generated by org-mode 6.33x in emacs 23

posted @ 2011-08-12 22:13  visayafan  阅读(302)  评论(0)    收藏  举报