题目链接:CLICK HERE~
尽管java一下模拟水过,可是我看到别人的一段奇妙代码,贴出和大家共享。
import java.math.*; import java.util.*; class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigDecimal Eight = new BigDecimal(8); while(cin.hasNext()){ String num; num = cin.nextLine(); BigDecimal ans = new BigDecimal(0); BigDecimal tmp = new BigDecimal(1); for(int i = 2;i < num.length();++i){ tmp = tmp.divide(Eight); ans = ans.add(new BigDecimal(num.charAt(i) - '0').multiply(tmp)); } System.out.println(num + " [8] = " + ans + " [10]"); } } }
这个算法是将除法转变为乘法。对于0.d1d2d3 ... dk [8],本来是d1/8+d2/(8^2)+...+dk/(8^k)。这个算法将 dn/8转变为 dn * 125。然后不断让 y 乘以 1000。起到保存小数位数的作用。最后的结果就相当于是 对dn每次乘以0.125。
#include<cstdio> #include<cstring> char c[50]; int i,l; double x,y; int main() { while(scanf("%s",c)!=EOF) { printf("%s [8] = ",c); l=strlen(c)-1; x=0; y=1; for(i=l;i>1;i--) { x=((c[i]-'0')*y+x)*125; y*=1000; } x/=y; i=0; while(x) { c[i]=int(x*=10)%10+'0'; x-=c[i]-'0';i++; } c[i]='