天天看點

ZZUOJ - 1081 - 三進制小數

1081: 三進制小數

Time Limit: 2 Sec   Memory Limit: 128 MB

Submit: 60   Solved: 22

[ Submit][ Status][ Web Board]

Description

你的任務呢,是将一個有理數轉換成三進制小數。“什麼是三進制小數呢?”你一定會問,這很明白,就是以三為基(二進制數以2為基,而十進制數則以10為基)的小數。

Input

有理數的值都是在0與1之間的,每個有理數都由一個分子和一個分母表示,分子與分母之間隔着一個斜杠。有理數的個數不會超過1000個。

Output

輸出格式見樣本輸出,它是以小數點開頭的具有10位精度的3進制數。 

Sample Input

1/3 1/4 1/6 7/8

Sample Output

.1000000000 .0202020202 .0111111111 .2121212122

HINT

Source

唉,一個簡單題也WA兩次,我發現我越來越不行了。。

思路:就是乘三取整,不過注意最後一位可能要進位

還要注意浮點數陷進,今天調用庫函數已經錯了兩個題了,哭%>_<%啊!

AC代碼:

/*************************************************************************
    > File Name: c.cpp
    > Author: zzuspy
    > Mail: [email protected] 
    > Created Time: 2014年12月03日 星期三 15時24分26秒
 ************************************************************************/
 
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#define LL long long
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
using namespace std;
 
const double n = 0.0000001;
 
int main()
{
    int a, b;
    while(scanf("%d/%d", &a, &b)!=EOF)
    {
        double num = (double)a/b;
        printf(".");
        for(int i=0; i<9; i++)
        {
            num*=3;
            printf("%d", (int)floor(num+n));
            num-=floor(num+n);
        }
        num*=3;
        int ans = (int)floor(num+n);
        num-=floor(num+n);
        if(floor(num*3+n)>=2 && ans<=1)printf("%d\n", ans+1);
        else printf("%d\n", ans);
    }
    return 0;
}
           

繼續閱讀