ZZUOJ - 1081 - 三进制小数

来源:互联网 发布:电脑解压软件2345 编辑:程序博客网 时间:2024/06/06 08:40

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: zzuspy@qq.com     > 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;}





1 0
原创粉丝点击