數制轉換

Description
 
對於任意十進制數轉換爲k進制,包括整數部分和小數部分轉換。整數部分採用除k求餘法,小數部分採用乘k取整法例如x=19.125,求2進制轉換
 
整數部分19,小數部分0.125
19 / 2 = 9 … 10.125 * 2 = 0.25 … 0
9 / 2 = 4 … 10.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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章