首页 > 代码库 > ZZUOJ - 1081 - 三进制小数
ZZUOJ - 1081 - 三进制小数
1081: 三进制小数
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 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; }
ZZUOJ - 1081 - 三进制小数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。