数制转换

Description

对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换

整数部分19, 小数部分0.125
19 / 2 = 9 … 1 0.125 * 2 = 0.25 … 0
9 / 2 = 4 … 1 0.25 * 2 = 0.5   … 0
4 / 2 = 2 … 0 0.5 * 2 = 1     … 1
2 / 2 = 1 … 0
1 / 2 = 0 … 1
所以整数部分转为 10011,小数部分转为0.001,合起来为10011.001 请用堆栈实现上述数制转换

Input

第一行输入一个t,表示下面将有t组测试数据。

接下来的t行的每行包含两个参数n(0<n<10000,且最多有8位小数)和k(1<k<=16),n表示要转换的数值,n可以带小数(也可以不带!),k表示要转换的数制,k必须是正整数。大于10的进制数据用A\B\C\D\E\F表示

Output

对于每一组测试数据,每行输出转换后的结果,小数部分大于8位的,只输出前8位小数

Sample Input

2
19.125 2
15.125 16
Sample Output

10011.001
F.2



代码
#include < iostream >
#include<stack>
using  namespace std;
int main()
{
    stack< int> mystack;
     int t,m,k;
     double b,a;
    cin>>t;
     while(t--)
    {
         int c,x[100],d=0,i=0,count=0;
        cin>>b>>k;
        m=b;
        a=b-m;
         while(m)
        {
            c=m%k;
            m=m/k;
            mystack.push(c);
        }
         while(1)
        {
            d=a*k;
             if(d>=k)
                 break;
            a=a*k;
            x[i++]=d;
            count++;
        }
        
         while(!mystack.empty())
        {
             if(mystack.top()<10)
            {
                cout<<mystack.top();
                mystack.pop();
            }
             else
            {
                 switch(mystack.top())
                {
                   case 10: cout<<"A"; mystack.pop();  break;
                   case 11: cout<<"B"; mystack.pop();  break;
                   case 12: cout<<"C"; mystack.pop();  break;
                   case 13: cout<<"D"; mystack.pop();  break;
                   case 14: cout<<"E"; mystack.pop();  break;
                   case 15: cout<<"F"; mystack.pop();  break;
                }
            }
        }

        
        cout<<".";
         for(i=0;i<count;i++)
            cout<<x[i];
        cout<<endl;
    
    }
     return 0;
}

你可能感兴趣的:(数制转换)