如题:http://poj.org/problem?id=1131
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6749 | Accepted: 3696 |
Description
Write a program to convert octal numerals between 0 and 1, inclusive, into equivalent decimal numerals.
Input
Output
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]
Source
题目思路:以0.123为例初始时:
0[8]=0[10]
两边加上3[8]: 3[8]=3[10]
两边除以8[10]:0.3[8]=0.375[10]
两边加上2[8]: 2.3[8]=2.375[10]
两边除以8[10]:0.23[8]=0.296875[10]
两边加上1[8]: 1.23[8]=1.296875[10]
两边除以8[10]:0.123[8]=0.162109375[10]
每次算出结果数组的最低一位,一直算到最高位。直接贴代码吧,不是很好说,按照程序笔算一下就懂。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[20],s2[50],s3[20];
int main()
{
// freopen("C:\\1.txt","r",stdin);
while(~scanf("%s",s1))
{
int l=strlen(s1);
strcpy(s3,s1);
int len=3*(l-2); //最终串的长度
s2[0]='0';
s2[1]='.';
int i,j;
j=2;
int t=0;
while(t<len)
{
int k=0;
t++;
for(i=l-1;i>1;i--)
{
int g=(s1[i]-'0')*10+k;
k=g/8;
s1[i]=g%8+'0';
}
s2[j++]=k+'0';
}
s2[j]='\0';
printf("%s [8] = ",s3);
j--;
while(s2[j]=='0')
j--;
for(i=0;i<=j;i++)
printf("%c",s2[i]);
printf(" [10]\n");
}
return 0;
}