//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]"); 
         } 
   } 
}  */


 

posted on 2011-08-10 17:09  →木头←  阅读(822)  评论(0编辑  收藏  举报