zju1086 (高精度)解题报告

原创 2011年01月20日 23:16:00

 

Octal Fractions


Time Limit: 1 Second      Memory Limit: 32768 KB


Fractions in octal (base 8) notation can be expressed exactly in decimal notation. For example, 0.75 in octal is 0.963125 (7/8 + 5/64) in decimal. All octal numbers of n digits to the right of the octal point can be expressed in no more than 3n decimal digits to the right of the decimal point.

Write a program to convert octal numerals between 0 and 1, inclusive, into equivalent decimal numerals. The input to your program will consist of octal numbers, one per line, to be converted. Each input number has the form 0.d1d2d3 ... dk, where the di are octal digits (0..7). There is no limit on k. Your output will consist of a sequence of lines of the form

0.d1d2d3 ... dk [8] = 0.D1D2D3 ... Dm [10]

where the left side is the input (in octal), and the right hand side the decimal (base 10) equivalent. There must be no trailing zeros, i.e. Dm is not equal to 0.


SAMPLE INPUT

0.75
0.0001
0.01234567


SAMPLE OUTPUT

0.75 [8] = 0.953125 [10]
0.0001 [8] = 0.000244140625 [10]
0.01234567 [8] = 0.020408093929290771484375 [10]

题目大一就是说给一个8进制的数,求出对应的十进制数,按题目要求来看最先想到得就是用每一位除以对应的8的幂,但是很显然,会受到精度的影响,所以可以换一种思路,例如,0.75【8】=((5/8)+7)/8【10】,所以之后就只要模拟除法进行高精度计算就可以了。

代码:

语言:c++

 

#include<iostream>

#include<cstring>

#include<cstdlib>

using namespace std;

int main()

{

char result[10000],a[10000];//result[]是十进制数结果,a[]是输入的8进制数

int count,len,i,j,num,temp;//len是8进制数的长度,count是十进制数的长度,num是每次取8进制数的一位转化成的整型数

while(scanf("%s",a)!=EOF)

{

count=0;//十进制数一开始的长度为0

len=strlen(a);

for(i=0;i<10000;++i)

result[i]='0';      //每次都先将结果数组置0

for(i=len-1;i>=2;--i)//从8进制数的最后一位开始取,进行高精度除法

{

num=int(a[i])-'0';//num用来存放整型数

for(j=0;j<count||num;++j)//判断条件为j超过十进制数的长度和num=0,即直到num除尽

{

if(j<count)

temp=num*10+(int(result[j])-'0');

else

temp=num*10;

result[j]=char(temp/8)+'0';//商

num=temp%8;//余数

}

result[j]='/0';//设置result数组的结尾标志符,以便输出和求长度;

count=strlen(result);//count为result数组的长度即十进制数的当前长度

}

cout<<a<<" [8] = 0."<<result<<" [10]"<<endl;

}

return 0;

}

 

 

相关文章推荐

POJ 1503(高精度整数加法) 解题报告

POJ 1503(高精度整数加法) 解题报告
  • masikkk
  • masikkk
  • 2011年03月18日 00:15
  • 1364

POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】

这道题目的整体思想,就是将float型数据,转化成整数,将计算float型幂次方,转变成求整数的幂次方。 然后利用数组来存储乘积的每一位。 核心代码就是那一段高精度求幂的代码,希望大家能够自己仔细...

poj1001解题报告(高精度浮点数乘法)

高精度浮点数的乘法,用模拟的方法可以得出结果,用数组来保存每一位,每位乘以目标乘数得到中间结果,把中间结果相加可得一次乘法结果,循环多次就得到了结果。 在本题中需要注意的是要把数据前后无用的零清理掉,...

POJ 1001 解题报告 高精度大整数乘法模版

有用的c++函数总结 find()函数; string成员函数有这个,algorithm库中也有这个 ,可以在容器中查找元素 string的at函数,比如string str; str.at(po...

Uva 11375 Matches 解题报告(递推+高精度)

Problem E: Matches We can make digits with matches as shown below: Given N matches, find the nu...
  • kbdwo
  • kbdwo
  • 2014年03月19日 14:07
  • 537

POJ3331解题报告 高精度幂

The Idiot of the Year Contest!Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 3074 Accepte...

POJ1001 求高精度幂 ACM解题报告(高精度模板)

这题主要就是去掉前导0和小数的后到0,还要注意这句话 对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。#incl...

HDU-1086 You can Solve a Geometry Problem too 解题报告

Description Many geometry(几何)problems were designed in the ACM/ICPC. Andnow, I also prepare a geome...

解题报告-PAT- Tree Traversals Again(1086)

解题报告-PAT- Tree Traversals Again Tree Traversals Again有两种解题思路: 1、在Push和Pop的过程中记录后序序列。 2、构造先序序列和中序序列,然...

2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)

2015 Multi-University Training Contest 6 solutions
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zju1086 (高精度)解题报告
举报原因:
原因补充:

(最多只允许输入30个字)