總時間限制: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(); } }