题目
解题思路
受限于C++的精度显示,所以得开一个数组来储存每一位的确切数字来进行解决
两种思路
①:设置一个高精度的加法计算,然后将输入的八进制数字从后往前×0.125的n次方再进行累加,储存
如0.123
可以表示成
3
∗
8
−
3
+
2
∗
8
−
2
+
1
∗
8
−
1
3*8^{-3} + 2*8^{-2}+1*8^{-1}
3∗8−3+2∗8−2+1∗8−1
②:循环嵌套:
比如0.123的八进制转换可以写成
(
(
3
/
8
+
2
)
/
8
+
1
)
/
8
((3/8+2)/8+1)/8
((3/8+2)/8+1)/8
在实现除以8的时候,我们可以考虑模拟竖式计算
法一:高精度计算
(待补充)
法二:嵌套循环
#include<iostream>
#include<string>
using namespace std;
void trans(int q)
{
string Octal;
char decimal[1000];
/*
① 八进制转换十进制时
从后往前,每次取出每一位的数(8)
将其与上一次除法运算得到的商相加
再除以8
*/
cin >> Octal;
int num;//记录十位数
int len = Octal.length() - 1;
int Dlen = 0;//记录十进制数的位数
for(; len != 1; len--)
{
num = Octal[len] - '0';
int digit = 0;//记录mod之后的数
int j = 0;//从前往后
do
{
int temp;
if(j < Dlen)
{
temp = num * 10 + decimal[j] - '0';
}
else
{
temp = num * 10;
//后面没有存放的数据了,只能继续往后借0
}
digit = temp % 8;
decimal[j++] = temp / 8 +'0';//别忘了j是要往后一位的,然后你是字符别忘记加0
num = digit;
}
while(digit || j < Dlen);
Dlen = j;//更新十进制的位数
}
cout << "case #" << q << ":" << endl <<"0.";
for(int i = 0; i < Dlen; i++)
{
cout << decimal[i];
}
cout << endl;
}
int main()
{
int total;
cin >> total;
for(int i = 0; i < total; i++)
{
trans(i);
}
}