NEUQOJ 1198: 三进制小数

来源:互联网 发布:金石软件win10 编辑:程序博客网 时间:2024/05/21 06:33

题目描述:

你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。

输入:

有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。

输出:

输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。

样例输入

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

样例输出

.1000000000
.0202020202
.2121212122

//讲个笑话我样例没过

WA:

#include <iostream>#include <cmath>#include <algorithm>#include <iomanip>#include <cstdio>using namespace std;/*没考虑进位*/int main(){    int a,b;    while(cin>>a)    {        getchar();        cin>>b;        double ans=1.0*a/b;        int pointans[11];        cout<<".";        for(int i=1;i<=10;i++)        {            ans*=3;            cout<<floor(ans);            ans-=floor(ans);        }        cout<<endl;    }    return 0;}

AC:

#include <iostream>#include <cmath>#include <algorithm>#include <iomanip>#include <cstdio>using namespace std;/*乘3取整*/int main(){    int a,b;    while(cin>>a)    {        getchar();        cin>>b;        double ans=1.0*a/b;//float精度不够        int pointans[11];        cout<<".";        for(int i=0;i<=10;i++)        {            ans*=3;            pointans[i]=floor(ans);//向下取整            ans-=floor(ans);        }        if(pointans[10]>=2)        {            pointans[9]++;//判断末尾是否需要进位        }        for(int i=9;i>=0;i--)        {            if(pointans[i]==3)//判断进位以3为基            {                pointans[i]=0;                pointans[i-1]++;            }        }        for(int i=0;i<=9;i++)        {            cout<<pointans[i];        }        cout<<endl;    }    return 0;}