OpenJudge 百練 2765 八進制小數(精度問題)

總時間限制:java

1000msios

內存限制:spa

65536kBcode

描述orm

八進制小數能夠用十進制小數精確的表示。好比,八進制裏面的0.75等於十進制裏面的0.963125 (7/8 + 5/64)。全部小數點後位數爲n的八進制小數均可以表示成小數點後位數很少於3n的十進制小數。ip

你的任務是寫一個程序,把(0, 1)中的八進制小數轉化成十進制小數。內存

輸入ci

輸入包括若干八進制小數,每一個小數佔用一行。每一個小數的形式是0.d1d2d3 ... dk,這裏di是八進制數0...7,並且已知0 < k < 15。input

輸出string

對於每一個輸入的八進制小數,輸入以下形式的一行

 

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]

C++ 解題:

#include <iostream>
#include <string.h>
#include <math.h>
#include <iomanip>
using namespace std;

int main()
{
    char input[16] = {0};
    cin>>input;
    double sum = 0;
    cout<<"0.";
    for (unsigned i = 2; i < strlen(input); i++)
    {
        sum += (input[i] - '0') * pow(0.125, i - 1);
        cout<<input[i];
    }
    cout<<" [8] = "<<setprecision(42)<<sum<<" [10]"<<endl;
    return 0;
}

C 解題(在個人機器上某些輸出精度不夠, 但卻在OpenJudge上AC)

#include<stdio.h>
#include<string.h>
char a[20];
int main()
{
    int i,d;
    double b,j;
    while(scanf("%s",a)!=EOF)
    {
        b=0;
        for(i=2,j=0.125; a[i]; i++,j/=8)
            b+=(a[i]-'0')*j;
        printf("%s [8] = %.45g [10]\n",a,b);
    }
}

Java 解題: 結果是對, 但卻 Time Limit Exceeded. 可見 Java 的 BigDecimal 爲了高精度而增長了CPU的運算開銷.

import java.math.BigDecimal;
import java.util.Scanner;

public class OpenJudge2765 {

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		//while (cin.hasNext()) {
			String octal = cin.next();
			BigDecimal sum = BigDecimal.ZERO;
			BigDecimal eighth = new BigDecimal("0.125");
			for (int i = octal.length() - 1; i > 1; i--) {
				sum = sum.multiply(eighth);
				sum = sum.add(eighth.multiply(new BigDecimal(String
						.valueOf(octal.charAt(i)))));
			}
			//System.out.println(String.format("%s [8] = %f [10]", octal, sum)); // 0.0001 [8] = 0.000244 [10]
			System.out.println(String.format("%s [8] = %s [10]", octal, sum.toPlainString()));

		//}
		cin.close();
	}
}
相關文章
相關標籤/搜索