poj 1131进制转换

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


转自 http://www.cnblogs.com/Mu-Tou/archive/2011/08/10/2133875.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值