#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