其他分享
首页 > 其他分享> > EOJ 3024 个人错误分析

EOJ 3024 个人错误分析

作者:互联网

 

 

 

3024. 八进制小数

单点时限: 2.0 sec

内存限制: 256 MB

写一个程序将 0 与 1 (不包括 0 和 1)之间的八进制数转化为等价的十进制数。

例如,八进制数 0.75 就是十进制数 0.953125(7×8−1+5×8−2)。

小数点右边有 n 位的所有八进制数都可以转化为小数点右边至多有 3×n 位的十进制数。

输入格式

第 1 行:一个整数 T (1≤T≤10) 为问题数。

接下来有 T 行,对应每个问题有 1 行,每行有一个八进制,该八进制数的形式为 0.d1d2d3d4…dk,其中 di(1≤i≤k)是八进制数码(0~7),k<50。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出转化后的等价十进制数。注意尾部不要输出多余的 0

样例

input
3
0.75
0.0001
0.01234567
output
case #0:
0.953125
case #1:
0.000244140625
case #2:
0.020408093929290771484375


 

//这道题是OpenJudge 百练 2765 八进制小数改编的,因此在查询答案时参考了很多,发现原题不需要用到高精度计算
//但这里还是需要的/(ㄒoㄒ)/~~
#include <stdio.h>
#include <string.h>
int main()
{
    int t, ret = 0;
    scanf("%d", &t);
    while (t--)
    {
        char num[200]; //接受输入,我之前用的是string类
        int len, len10 = 0, i, j, num8[200], num10[600] = {0};
        scanf("%s", num);
        len = strlen(num); //长度
        for (i = len - 1, j = 0; i > 1; i--, j++)
            num8[j] = num[i] - '0'; //倒序写入
        len -= 2;                   //隐藏小数点和0两位重量级玩意
        for (i = 0; i < len; i++)
        {
            num10[0] = num8[i];  
            int len_res, rem = num10[0];
            for (len_res = 0; len_res < len10 || rem;)
            {
                num10[len_res] = rem / 8; 
                rem = (rem % 8) * 10 + num10[++len_res];
            }
            len10 = len_res;
        }//÷8的实现代码

        printf("case #%d:\n0.", ret++);
        for (i = 1; i < len10; i++)
            printf("%d", num10[i]);
        printf("\n");
    }
    return 0;
}
//参考资料来源https://blog.csdn.net/OrdinaryCrazy/article/details/77926287

 

标签:错误,++,EOJ,3024,rem,len,num10,res,八进制
来源: https://www.cnblogs.com/emokable/p/15952757.html