1. 程式人生 > >2765 :八進位制小數

2765 :八進位制小數

總時間限制: 1000ms 記憶體限制: 65536kB

描述

八進位制小數可以用十進位制小數精確的表示。比如,八進位制裡面的0.75等於十進位制裡面的0.963125 (7/8 + 5/64)。所有小數點後位數為n的八進位制小數都可以表示成小數點後位數不多於3n的十進位制小數。

你的任務是寫一個程式,把(0, 1)中的八進位制小數轉化成十進位制小數。 輸入 輸入包括若干八進位制小數,每個小數佔用一行。每個小數的形式是0.d1d2d3 … dk,這裡di是八進位制數0…7,而且已知0 < k < 15。 輸出 對於每個輸入的八進位制小數,輸入如下形式的一行

0.d1d2d3 … dk [8] = 0.D1D2D3 … Dm [10]

這裡左邊是輸入的八進位制小數,右邊是相等的十進位制小數。輸出的小數末尾不能有0,也就是說Dm不等於0。

樣例輸入

0.75 0.0001 0.01234567

樣例輸出

0.75 [8] = 0.953125 [10] 0.0001 [8] = 0.000244140625 [10] 0.01234567 [8] = 0.020408093929290771484375 [10]

程式碼

#include <stdio.h>
#include <string.h>
int main()
{
    char s[20];
    int len;
    double n;
    while(scanf("%s",s)!=EOF)
    {
        n=0;
        len=strlen(s);
        for(int i=len-1;s[i]!='.';i--)//小數點前面的處理
        {
        	/**
			十進位制小數轉N進位制
			小數部分 × n 取整數  ↓排列 
			**/ 
			//逆方向計算 得出十進位制 
            n/=double(8.0);//轉化為十進位制
            n+=double(s[i]-'0');
        }
        n/=double(8.0);//小數點前那一個還沒處理
        printf("%s",s);
        printf(" [8] = %.45g [10]\n",n);//%g指代浮點數,去掉無意義的零
    }
    return 0;
}