POJ1131 Octal Fractions
1 #include<stdio.h> 2 #include<string.h> 3 char s[1000]; 4 int b[4000]; 5 int main() 6 { 7 int i,j,k,n,t,len; 8 while(~scanf("%s",s)){ 9 memset(b,0,sizeof(b)); 10 len=strlen(s); 11 for(t=0,i=len-1;i>=2;i--){ 12 n=s[i]-'0'; 13 for(k=j=0;j<t||n;j++){ 14 n=n*10+b[j]; 15 b[k++]=n/8; 16 n%=8; 17 } 18 t=k; 19 } 20 printf("%s [8] = 0.",s); 21 for(i=0;i<t;i++) 22 printf("%d",b[i]); 23 puts(" [10]"); 24 } 25 return 0; 26 }
题意:给出1个八进制小数,小数位数很多,输出转成十进制后的小数。。
暴力模拟即可,看到discuss里说拿double卡过,我想还是写个高精度计算练练手速和代码实现能力比较好。。
不过千万不要带着小数做除法。。
①先说最直接的想法,从十分位到最后一位,每次乘上8的(-i)次方,累加即可,但这样写起高精度来异常麻烦,有可能涉及到高除高。
②稍作思考,我们发现从最后一位开始到小数点之前停下来,上一位算出来的数加上这一位的数除以8即可当做当前位算出来的数。
例如:0.233 [(3/8+3)/8+2]/8就是答案。
但计算机处理如此精度的小数,高精度写的多累啊(高手勿喷)。
③于是想到了化小数为整数,每次除以8之前看看能否被8整除(这个判断应该知道吧,看后三位能不能被8整除),不能的话乘10再看,乘10的同时计数器加1,直到能被8整除,除以8。
举个例子
0.75
看5不能被8整除,5000可以,pos=3 5000/8=625
此时不能在625的基础上加7,应该加7*(10^pos),补全你乘的10,得到7625
此时7625不能被8整除,而7625000可以
pos=6 7625000/8=953125
最后输出的时候小数点往前移动pos位即可。
整个过程数组模拟计算,否则后果你知道。。