zoj 1086 Octal Fractions

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=86

题目的意思是让你把一个八进制的纯小数转化为十进制。题意很简单。主要的问题是高精度计算,不能直接用double之类的来处理,而要用数组解决。方法很简单,我一开始以为会超时,看了下states,发现没有多少TLE,所以就写了代码。

解题思路:我们对于每个位分开处理,把这一个位的数先转化成十进制,然后把所有的位数上的结果加起来。

代码:

#include<stdio.h> #include<string.h> int main() { int octal[20][60]; for(int i=0;i<20;i++) for(int j=0;j<60;j++) octal[i][j] = 0; octal[0][0] = 1; for(int i=1;i<20;i++) { int tmp = 0; for(int j=0;j<60;j++) { octal[i][j] = (octal[i-1][j] + 10 * tmp)/8; tmp = (octal[i-1][j]+10*tmp) % 8; } } char input[50]; int mid[20][100]; int output[100]; while(scanf("%s",&input)!=EOF) { int len = strlen(input); for(int i=2;i<len;i++) { for(int j=0;j<60;j++) { mid[i-1][j] = (input[i]-'0') * octal[i-1][j]; } } for(int j=0;j<60;j++) { output[j] = 0; for(int i=1;i<len-1;i++) { output[j]+=mid[i][j]; } } int tmp = 0; bool flag = true; for(int j=59;j>=0;j--) { int sum = tmp+output[j]; tmp = sum/10; output[j] = sum%10; if(flag && output[j]!=0) { output[j+1] = -1; flag = false; } } printf("%s [8] = 0.",input); for(int j=1;j<60;j++) { if(output[j]==-1) break; printf("%d",output[j]); } printf(" [10]/n"); } }

我的代码比较冗余,可以参考http://01zhou.cn/post/29.html的代码,比我的要精简点。

你可能感兴趣的:(zoj 1086 Octal Fractions)