浙江大学OJ上的一道基础编程题http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1086
ZOJ1086——Octal Fractions
编程任务:
将0~1之间的八进制小数,转换为等值的十进制数。程序输入是八进制数,每行一个,分别转换成十进制数。输入数据的格式为0.d1d2d3…dk,其中di为八进制数值,输出格式0.d1d2d3…dk [8] = 0.D1D2D3…Dm [10],Dm不为0
算法分析:
从八进制小数的最低位开始,除以8后,与前一位相加,一直到小数点后的第一位小数。如0.75:
①5/8 = 0.625
②(0.625+7) / 8 = 0.93125
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MaxN 100
int main()
{
char src[MaxN];//八进制的小数
int i,j;
while(scanf("%s",src) != EOF)
{
char dest[MaxN] = {'0'};//十进制的小数
int index = 0;//十进制小数的长度
//从八进制小数的最后一位开始累除
for(i = strlen(src) - 1;i > 1;i--)
{
int num = src[i] - '0';//八进制小数的当前位
int temp;
for(j = 0;j < index || num;j++)
{
temp = num*10 + (j < index ? dest[j] - '0' : 0);
dest[j] = temp / 8 - '0';//商
num = temp % 8;//余数
}
index = j;//十进制小数的实际位数
}
dest[j] = '\0';//字符串结束标志
printf("%s [8] = 0.%s [10]\n",src,dest);
}
return 0;
}