去年在網上給一家公司投簡歷的時候,對方要求寫一個任意進制轉換的函數,當時沒有回過神來,也不知道JAVA中有這樣的函數,呵呵。于是就自己操刀,寫了這個三十六進制之音隨便轉的函數。不過,權當練習吧,如果你不會,倒真的可以看看,學學二進制到十進制、十進制到二進制之音是如何轉何的。

/*
 程序说明:
 理论上是一个任意进制的程序,但是由于字母的有限,所有只能转换最多36进制,即0-9,a-z
 思路是:
 先将任意进制转换为10进制,再将10进制转换到任意进制
 1、任意进制转换为10进制的转换
 分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合,利用相乘相加的原则
 整数部分:(如111的二进制到十进制就是:1*pow(2,2)+1*pow(2,1)+1*pow(2,1))
 小数部分:利用相乘相加的原则
 2、10进制转换到任意进制的转换
 分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合
 整数部分:利用相除取余的原则
  
 小数部分:利用相乘取整的原则
  如:原数为0.9876,转换为二进制,即每次乘2(当然这个便没有举好,有错误,能理解就行了)
  现数 余数  
  0.9752 1
  0.9504 1
  0.9008 1
  0.8016 1
  0.6032 1
  0.2064 1
  0.4128 0
*/
import java.io.*;

import java.util.*;

public class JZZH
{
  //*****************************任意进制到十进制的转换*****************************
  //任意进制到十进制的转换

String anySystemToTen(double longNum)
    throws Exception
  {
    String strNum = String.valueOf(longNum);
    //将取得的整数部份和小数部份的进制结合在一起,并将其还原为浮点数
    //strNum=intToTenSystem(strInt,JZ)+"."+lessToTenSystem(strLess,JZ);
    return strNum;
  }
  //保证输入的数与进制相配

boolean checkInputNumIsOK(int Num, int JZ)
  {
    if (Num <= JZ - 1)
      return true;
    else
      return false;
  }
  //由取最得的字符返回相应的数字

String letterToInteger(String tChar)
  {
    int gotNum = 0;
    int kg = 0; //确定前面该字符是不是已经赋值,这就是使用if语句所留下的后症
    String S;
    if (tChar.equals("A"))
    {
      gotNum = 10;
      kg = 1;
    }
    else if (tChar.equals("B"))
    {
      gotNum = 11;
      kg = 1;
    }
    else if (tChar.equals("C"))
    {
      gotNum = 12;
      kg = 1;
    }
    else if (tChar.equals("D"))
    {
      gotNum = 13;
      kg = 1;
    }
    else if (tChar.equals("E"))
    {
      gotNum = 14;
      kg = 1;
    }
    else if (tChar.equals("F"))
    {
      gotNum = 15;
      kg = 1;
    }
    else if (tChar.equals("G"))
    {
      gotNum = 16;
      kg = 1;
    }
    else if (tChar.equals("H"))
    {
      gotNum = 17;
      kg = 1;
    }
    else if (tChar.equals("I"))
    {
      gotNum = 18;
      kg = 1;
    }
    else if (tChar.equals("J"))
    {
      gotNum = 19;
      kg = 1;
    }
    else if (tChar.equals("K"))
    {
      gotNum = 20;
      kg = 1;
    }
    else if (tChar.equals("L"))
    {
      gotNum = 21;
      kg = 1;
    }
    else if (tChar.equals("M"))
    {
      gotNum = 22;
      kg = 1;
    }
    else if (tChar.equals("O"))
    {
      gotNum = 23;
      kg = 1;
    }
    else if (tChar.equals("P"))
    {
      gotNum = 24;
      kg = 1;
    }
    else if (tChar.equals("Q"))
    {
      gotNum = 25;
      kg = 1;
    }
    else if (tChar.equals("R"))
    {
      gotNum = 26;
      kg = 1;
    }
    else if (tChar.equals("S"))
    {
      gotNum = 27;
      kg = 1;
    }
    else if (tChar.equals("T"))
    {
      gotNum = 28;
      kg = 1;
    }
    else if (tChar.equals("U"))
    {
      gotNum = 29;
      kg = 1;
    }
    else if (tChar.equals("V"))
    {
      gotNum = 30;
      kg = 1;
    }
    else if (tChar.equals("W"))
    {
      gotNum = 31;
      kg = 1;
    }
    else if (tChar.equals("X"))
    {
      gotNum = 32;
      kg = 1;
    }
    else if (tChar.equals("Y"))
    {
      gotNum = 33;
      kg = 1;
    }
    else if (tChar.equals("Z"))
    {
      gotNum = 34;
      kg = 1;
    }
    else if (kg == 0)
    {
      gotNum = Integer.parseInt(tChar);
    }
    S = String.valueOf(gotNum);
    return S;
  }

//浮点数的整数部份转换为十进制

String intToTenSystem(String strNum, int JZ)
    throws Exception
  {
    strNum = strNum.toUpperCase(); //全部转换为大写,方便字符到数字的转换  
    double longNum = 0;
    int len = strNum.length(); //取得字符串的长度
    int tInt = 0; //初使化数组位置为0
    int gotNum = 0; //一个一个字符取出所对应的数字
    while (len > 0)
    { //如果没有将字符串的字符转换完,就继续   
      String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
      gotNum = Integer.parseInt(letterToInteger(tChar));
      if (!checkInputNumIsOK(gotNum, JZ))
      {
        System.out.println("你的输入与转换的进制不符,请检查!");
        System.exit(-1);
      }

longNum = longNum + gotNum * (Math.pow(JZ, len - 1));
      tInt++;
      len--;

}
    return String.valueOf(longNum);
  }
  //浮点数小数部份转换为十进制

String lessToTenSystem(String strNum, int JZ)
    throws Exception
  {
    strNum = strNum.toUpperCase();
    double longNum = 0;
    int len = strNum.length(); //取得字符的长度
    int tInt = 0; //取第tInt个字符
    int gotNum = 0; //取出的字符转换为数字
    int cfInt = -1; //多少次次方
    while (len > 0)
    {
      String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
      gotNum = Integer.parseInt(letterToInteger(tChar));
      if (!checkInputNumIsOK(gotNum, JZ))
      {
        System.out.println("你的输入与转换的进制不符,请检查!");
        System.exit(-1);
      }
      //保存出小数部份从对应的进制到十进制的总值
      longNum = longNum + gotNum * (Math.pow(JZ, cfInt)); //关键算法
      tInt++; //字符串中位置加一
      len--; //字符串总长度减一
      cfInt--;
    }
    return String.valueOf(longNum);
  }
  //返回一个浮点数的整数或者是小数部份

String returnWantPart(String doubleNum, String whichPart)
    throws Exception
  {
    String strNum = doubleNum;
    String leftStr;
    String rightStr;
    //如果输入的是一个浮点数
    if (strNum.indexOf(".") != -1)
    {
      StringTokenizer fenxi = new StringTokenizer(strNum, ".");
      leftStr = fenxi.nextToken();
      rightStr = fenxi.nextToken();
    }
    else
    { //如果输入的是一个整数
      leftStr = strNum;
      rightStr = "0";
    }
    String returnStr = "";
    if (whichPart.equals("left"))
      returnStr = leftStr;
    else if (whichPart.equals("right"))
      returnStr = rightStr;
    return returnStr;
  }
  //*****************************任意进制到十进制的转换*****************************
  //*****************************十进制到任意进制的转换*****************************

String tenToAnySystem_Int(String strInt, int JZ)
  { //因为由任意进制到十进制的转换结果为"整数部分.小数部份"
    //也就是分成整数和小数部份分别转换
    //此函数完成的功能是十进制的整数部分到任意进制的转换  
    try
    {
      //取出整数部份 
      strInt = returnWantPart(strInt, "left");
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    long intStr = Long.parseLong(strInt);
    long[] result = new long[50]; //用50个数组来保存相除的余数
    long T;
    String resultStr = "";
    int i = 0; //数组的下标
    while (intStr != 0)
    {
      result[i] = intStr % JZ; //取出余数
      intStr = intStr - result[i]; //现数为减去余数的数
      intStr = intStr / JZ;
      i++; //数组下标增加一
    }
    //将数组全部反序排列,并返回结果
    for (int j1 = 0, j2 = i - 1; j1 < (i / 2); j1++, j2--)
    {
      T = result[j1];
      result[j1] = result[j2];
      result[j2] = T;
    }
    for (int j = 0; j < i; j++)
    {
      resultStr = resultStr + intToLetter(result[j]);

}
    return resultStr;

}
  //此函数完成的功能是十进制的小数部分到任意进制的转换

String temToAnySystem_Less(String strLess, int JZ)
  {
    double T = 0;
    T = Double.parseDouble(strLess);
    String resultStr = "";
    String strInt = "";
    //精度取到小数点后面6位为止
    int JinDu = 0;
    int i = 0; //数组下标  
    int[] result = new int[50];
    for (int j = 0; j < 50; j++) //将数组初使化
      result[j] = 0;
    try
    {
      while (JinDu <= 6 && T > 0.000001)
      {
        double tNum = 0;
        tNum = T * JZ;
        if (tNum > 1)
        { //取出整数部份
          try
          {
            strInt = returnWantPart(String.valueOf(tNum), "left");
          }
          catch (Exception e)
          {
            e.printStackTrace();
          }
          result[i] = Integer.parseInt(strInt);
          T = tNum - result[i]; //将当前数减去取出来的数
        }
        else
        {
          //如果整数小于零,那么整数部分就是0
          result[i] = 0;
        }
        JinDu++;
        i++;

}
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    for (int j = 0; j < i; j++)
      resultStr = resultStr + String.valueOf(result[j]);
    if (i == 0)
      return "0";
    else
      return resultStr;

}
  //将取得的数字转换为相应的字母

String intToLetter(long num)
  {
    String result = "";
    String S = "";
    if (0 <= num && num <= 9)
      result = String.valueOf(num);
    else if (num > 9)
    {
      S = String.valueOf(num); //将长整型转换为字符串型
      switch (Integer.parseInt(S)) //将字符串型转换为整型
      {
        case 10:
          result = "A";
          break;
        case 11:
          result = "B";
          break;
        case 12:
          result = "C";
          break;
        case 13:
          result = "D";
          break;
        case 14:
          result = "E";
          break;
        case 15:
          result = "F";
          break;
        case 16:
          result = "G";
          break;
        case 17:
          result = "H";
          break;
        case 18:
          result = "I";
          break;
        case 19:
          result = "G";
          break;
        case 20:
          result = "K";
          break;
        case 21:
          result = "L";
          break;
        case 22:
          result = "M";
          break;
        case 23:
          result = "N";
          break;
        case 24:
          result = "O";
          break;
        case 25:
          result = "P";
          break;
        case 26:
          result = "Q";
          break;
        case 27:
          result = "R";
          break;
        case 28:
          result = "S";
          break;
        case 29:
          result = "T";
          break;
        case 30:
          result = "U";
          break;
        case 31:
          result = "V";
          break;
        case 32:
          result = "W";
          break;
        case 33:
          result = "X";
          break;
        case 34:
          result = "Y";
          break;
        case 35:
          result = "Z";
          break;
      }
    }
    return result;
  }
  //*****************************十进制到任意进制的转换*****************************

public static void main(String[] arg)
    throws Exception
  {
    try
    {
      JZZH jzzh = new JZZH();
      BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));
      String inData = " ";

while (!inData.toUpperCase().equals("QUIT"))
      {
        System.out.print("请输入一个数(quit退出)(格式:原数,原数进制,要转换到的进制):");
        inData = br.readLine();
        if (inData.equals("") || inData.equals(" "))
          continue;
        if (inData.toUpperCase().equals("QUIT"))
          break;
        StringTokenizer fenxi = new StringTokenizer(inData, ",");
        String tData = fenxi.nextToken(); //取出原数
        //String whichPart=
        //System.out.println("The Result is :"+tData);
        int whichSystem = Integer.parseInt(fenxi.nextToken()); //取出原进制
        int targetSystem = Integer.parseInt(fenxi.nextToken()); //取出要转换的进制
        String returnLeftPart; //输入数的整数部分
        String returnRightPart; //输入数的小数部分
        //分别取出数的左面和右面
        returnLeftPart = jzzh.returnWantPart(tData, "left"); //取出输入数的整数部分
        returnRightPart = jzzh.returnWantPart(tData, "right"); //取出输入数的小数部分

String anyChangedToIntSystem; //用于接收输入数的整数部分转换后的结果
        String anyChangedToLessSystem; //用于接收输入数的小数部分转换后的结果
        anyChangedToIntSystem =
            jzzh.intToTenSystem(returnLeftPart, whichSystem);
        anyChangedToLessSystem =
            jzzh.lessToTenSystem(returnRightPart, whichSystem);

double leftNum = Double.parseDouble(anyChangedToIntSystem);
        double rightNum = Double.parseDouble(anyChangedToLessSystem);
        double totalNum = leftNum + rightNum; //拼合结果
        System.out.println(tData + "由" + whichSystem + "到10进制的结果是:" +
                           jzzh.anySystemToTen(totalNum));

//十进制到任意进制的转换temToAnySystem_Less
        String tenChangedToAnySystemInt = "";
        String tenChangedToAnySystemLess = "";
        tenChangedToAnySystemInt =
            jzzh.tenToAnySystem_Int(anyChangedToIntSystem, targetSystem);
        tenChangedToAnySystemLess =
            jzzh.temToAnySystem_Less(anyChangedToLessSystem, targetSystem);
        System.out.println(tData + "由" + whichSystem + "到" + targetSystem +
                           "进制的结果是:" + tenChangedToAnySystemInt + "." +
                           tenChangedToAnySystemLess);

}
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

三十六進制之間隨便轉換相关推荐

  1. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  2. 第三百三十六章 斗宗强者间的大战!

    第三百三十六章 斗宗强者间的大战! <script language="javascript" src="/js/style2.js"></s ...

  3. linux查看hex编码,小弟我使用过的Linux命令之hexdump - ”十六“进制查看器

    我使用过的Linux命令之hexdump - "十六"进制查看器 我使用过的Linux命令之hexdump - "十六"进制查看器 本文链接:http://co ...

  4. Python编程基础:第三十六节 模块Modules

    第三十六节 模块Modules 前言 实践 前言 我们目前所有的代码都写在一个文档里面.如果你的项目比较大,那么把所有功能写在一个文件里就非常不便于后期维护.为了提高我们代码的可读性,降低后期维护的成 ...

  5. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  6. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. 三十六、Java集合中的HashMap

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  8. 三十六、rsync通过服务同步、Linux系统日志、screen工具

    三十六.rsync通过服务同步.Linux系统日志.screen工具 一.rsync通过服务同步 该方式可以理解为:在远程主机上建立一个rsync的服务器,在服务器上配置好各种应用,然后本机将作为客户 ...

  9. JavaScript学习(三十六)—移动的小球

    JavaScript学习(三十六)-移动的小球 代码如下: <!DOCTYPE html> <html lang="en"><head>< ...

最新文章

  1. pywinauto 记事本操作示例 移动鼠标 使用键盘 自动操作软件
  2. linux服务器密码策略,windows与linux服务器平台密码策略管理
  3. H标签对网站SEO优化是不可或缺的!
  4. how to export many stock data from Wind terminal
  5. 关于视频光端机调制方式及介质特点的介绍
  6. LeetCode —— 897. 递增顺序查找树(Python)
  7. Ubuntu 12.04下NFS安装配置图解
  8. 随想录(学校作业和工程代码)
  9. Longest Ordered Subsequence 最长上升子序列+DP
  10. go golang 判断base64数据 获取随机字符串 截取字符串
  11. webstorm更换主题后快捷键失效
  12. MVC进阶学习--HtmlHelper控件解析(五)
  13. Linux 查看端口状态 netstat
  14. 销售订单批量导入(1)
  15. 手机连接电脑DCIM目录下文件夹和图片显示不全
  16. deepin-wine下微信升级到最新版方法
  17. 如何做一个真正的男人
  18. 安装程序无法自动安装 Virtual Machine Communication Interface Sockets (VSock) 驱动程序,必须手动安装此驱动程序
  19. Java编程题小练习(初级):输入10个整数并进行排序输出。
  20. Simpack求解器说明

热门文章

  1. 物联网打工人必备:LiteOS Studio图形化调测能力
  2. 【Python3网络爬虫开发实战】1.3.3-pyquery的安装
  3. windows 查看网络中断事件_等保测评2.0:Windows安全审计
  4. java运行多个linux命令_在shell的一行中运行多个命令
  5. poj 3660 CwoContest Floyed传递闭包
  6. FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验
  7. 基于android的视频播放器,基于Android的视频播放器的设计与实现-.doc
  8. java swing 实现下拉列表点击事件
  9. Python文件读取(1.1)
  10. 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...