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
。
样例
input3 0.75 0.0001 0.01234567output
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