zoukankan      html  css  js  c++  java
  • 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位即可。

    整个过程数组模拟计算,否则后果你知道。。 

  • 相关阅读:
    hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
    spring问题排查-调低日志等级
    android中的返回键与Activity
    poj 1273 Drainage Ditches
    zoj Reactor Cooling
    Android build-tools升级到23.0.0_rc1无法解决编译后的问题
    HDU ACM 2845 Beans-&gt;动态规划
    HTML中心在页面上弹出自定义表单层(实现可能拖累)
    欧氏定理最大公约数和最小公倍数
    token session cookie
  • 原文地址:https://www.cnblogs.com/shihuajie/p/3031587.html
Copyright © 2011-2022 走看看