zjtu cpp1299 10进制小数转N进制小数


#include<iostream>
#include<vector>
using namespace std;
#define N 10
vector<int>s;
void fun(vector<int>&g, double x, int y);
int main()
{
    int a, b;
    char c;
    while (cin >> a >> c >> b)
    {
        s.clear();
        double t = (double)a / b;
        fun(s, t, 3);
        cout << ".";
        for (int i = 0; i < N; i++)
            cout << s[i];
        cout << endl;
    }
    return 0;
}
void fun(vector<int>& g, double x, int y)//转化函数,g为转化后数据的保存数组,x为10进制小数,y为要转化成的进制
{
    for (int i = 0; i <= N; i++)//因为要保存10位,至于=N,下面再解释
    {
        x = x * y;//比如此题,x=3*x,然后将整数位的部分保存到数组中,如0.2*3=0.6,将0保存到数组中,利用强制类型转化
        g.push_back((int)x);
        if (x >= 1.0)//如1.3>1.0,所以x=1.3-1.0=0.3 进行下一次循环
            x -= g[i];
    }
    if (g[N] == 2)//本题有个小陷阱 它的最后一例输入实例,最后输出的实例,最后一位有四舍5入的操作,转化成3进制则为1舍2入,所以要先保存11位,如果第11位=2,则第10位+1
    {
        g[N - 1]++;
        for (int i = N - 1; i >= 0; i--)
        {
            if (g[i] == 3)//当第10位+1时,如果=3,则要进1,3变0(和10进制加法一个道理)
            {
                g[i] = 0;
                g[i - 1]++;
            }                
        }
    }
}



总结 上面的fun函数是一个10转n进制的模板函数,如果不要四舍五入的操作,最后那步可删除,如果要 ,修改下四舍五入的边界值即可
扩展:
2进制小数转10进制
如2进制0.101转10进制=1*2^-1+0*2^-2+1*2^-3

代码学习笔记 文章被收录于专栏

学习笔记,pat,牛客

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务