成长轨迹43 【ACM算法之路 百炼poj.grids.cn】【数值转换】【2765:八进制小数】
题目
http://poj.grids.cn/practice/2765
【注意】
%g可以自动删去末尾的0~
而且,%g会以%f%e中较短的输出宽度输出单、双精度实数
【wa代码】
//一开始wa的代码。。。
//好吧我没看到这句话wa的:
//“……输出的小数末尾不能有0,也就是说Dm不等于0。”
#include<stdio.h>
#include<string.h>
int main()
{
while(1)
{
char n[20];
if(scanf("%s",n)==EOF)
break;
int len = strlen(n);
double n10=0;
for(int i=len-1;n[i]!='.';i--)
{
n10/=double(8.0);
n10+=double(n[i]-'0');
}
n10/=double(8.0);// .那位少除了一次
for(int i=0;i<len;i++)
printf("%c",n[i]);
switch((len-2)*3)
{
case 3:
{
printf(" [8] = %.3lf [10]\n",n10);
break;
}
case 6:
{
printf(" [8] = %.6lf [10]\n",n10);
break;
}
case 9:
{
printf(" [8] = %.9lf [10]\n",n10);
break;
}
case 12:
{
printf(" [8] = %.12lf [10]\n",n10);
break;
}
case 15:
{
printf(" [8] = %.15lf [10]\n",n10);
break;
}
case 18:
{
printf(" [8] = %.18lf [10]\n",n10);
break;
}
case 21:
{
printf(" [8] = %.21lf [10]\n",n10);
break;
}
case 24:
{
printf(" [8] = %.24lf [10]\n",n10);
break;
}
default:
{
printf(" [8] = %f [10]\n",n10);
break;
}
}
}
return 0;
}
//%g可以自动删去末尾的0~
//而且,%g会以%f%e中较短的输出宽度输出单、双精度实数
【ac代码】
#include<stdio.h>
#include<string.h>
int main()
{
while(1)
{
char n[20];
if(scanf("%s",n)==EOF)
break;
int len = strlen(n);
double n10=0;
for(int i=len-1;n[i]!='.';i--)
{
n10/=double(8.0);
n10+=double(n[i]-'0');
}
n10/=double(8.0);// .那位少除了一次
for(int i=0;i<len;i++)
printf("%c",n[i]);
printf(" [8] = %.45g [10]\n",n10);
}
return 0;
}