#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

京公网安备 11010502036488号