//POJ 1131 Octal Fractions 任意进制之间小数的转换
//给定一个八进制的小数题目要求你把它转换为十进制小数,
//转换后小数的位数是转换前八进制小数位数的3倍且不输出末尾无意义的零(即后置零).
// 我采用的方法是乘10然后对8取整(现在假设将p进制的小数转换为n进制,同样采用乘n取整:),
//每转换一位,都必须从最低位s[len-1]开始至小数的最高位(即小数点后的一位),
//每次计算积 g=a[j]*n+k(其中k为下一位积的进位),本位进位数 k=g/p,
//积在本位存入 s[j]=g%p;最后的整数k作为转换的一位存放于转换结果字符串中。
我其实很恶心这种高精度的,,不过也列出了一种JAVA的写法。。看来JAVA要好好学点。。
#include<iostream>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;
char s1[20],s2[50],s3[20];
int main()
{
int i,t,j,k,g,l,len;;
while(scanf("%s",s1)!=EOF)
{
l=strlen(s1);
strcpy(s3,s1);
len=3*(l-2);
t=0;
s2[0]='0';
s2[1]='.';
j=2;
while(t<len)
{
k=0;
t++;
for(i=l-1;i>1;i--) //从最低位开始采用乘10对8取整
{
g=(s1[i]-'0')*10+k;
k=g/8;
s1[i]=g%8+'0';
}
s2[j]=k+'0';
j++;
}
s2[j]='\0';
printf("%s [8] = ",s3);
j--;
while(s2[j]=='0') //找出最后一个不为0的数的位置
j--;
for(i=0;i<=j;i++) //去掉后置0进行的输出
printf("%c",s2[i]);
printf(" [10]\n");
}
system("pause");
return 0;
}
//在上述基础上写了一个将p进制的小数转换为n进制小数的程序(2到16进制之间小数的数制转换)
/*
#include<iostream>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;
string ss="0123456789ABCDEF";
string change(string s,int p,int n)
{
int i,t,k,g,l,pos,len;
string str;
l=s.size();
pos=s.find(".");
len=3*(l-pos-1); //将p进制的小数转换为n进制的小数且转换后的小数位数为转换前的三倍,但不输出后置零
t=0;
str+="0.";
while(t<len)
{
k=0;
t++;
for(i=l-1;i>pos;i--) //乘n对p取整
{
g=(s[i]-'0')*n+k;
k=int(g/p);
s[i]=g%p+'0';
}
str+=ss.substr(k,1);
}
return str;
}
int main()
{
string s1,s2;
int p,n,i,j;
while(1)
{
cin>>s1;
cin>>p>>n;
s2=change(s1,p,n);
i=s2.size()-1;
while(s2[i]=='0')
i--;
cout<<s1<<" ["<<p<<"] = ";
for(j=0;j<=i;j++)
cout<<s2[j];
cout<<" ["<<n<<"]"<<endl;
}
system("pause");
return 0;
}*/
/*
JAVA
//用到的方法:
//1.BigDecimal.add(BigDecimal);
//2.BigDecimal.divide(BigDecimal);
view plain
import java.math.BigDecimal;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
String str=cin.next();
BigDecimal Fin=new BigDecimal(0);
for(int i=2;i<str.length();i++)
{
BigDecimal sub=new BigDecimal((int)str.charAt(i)-48);
BigDecimal mom=new BigDecimal(8);
Fin=Fin.add(sub.divide(mom.pow(i-1)));
}
System.out.println(str+" [8] = "+Fin+" [10]");
}
}
} */