三十六進制之間隨便轉換
去年在網上給一家公司投簡歷的時候,對方要求寫一個任意進制轉換的函數,當時沒有回過神來,也不知道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
三十六進制之間隨便轉換相关推荐
- 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...
1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...
- 第三百三十六章 斗宗强者间的大战!
第三百三十六章 斗宗强者间的大战! <script language="javascript" src="/js/style2.js"></s ...
- linux查看hex编码,小弟我使用过的Linux命令之hexdump - ”十六“进制查看器
我使用过的Linux命令之hexdump - "十六"进制查看器 我使用过的Linux命令之hexdump - "十六"进制查看器 本文链接:http://co ...
- Python编程基础:第三十六节 模块Modules
第三十六节 模块Modules 前言 实践 前言 我们目前所有的代码都写在一个文档里面.如果你的项目比较大,那么把所有功能写在一个文件里就非常不便于后期维护.为了提高我们代码的可读性,降低后期维护的成 ...
- OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC
OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...
- NeHe OpenGL教程 第三十六课:从渲染到纹理
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 三十六、Java集合中的HashMap
@Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- 三十六、rsync通过服务同步、Linux系统日志、screen工具
三十六.rsync通过服务同步.Linux系统日志.screen工具 一.rsync通过服务同步 该方式可以理解为:在远程主机上建立一个rsync的服务器,在服务器上配置好各种应用,然后本机将作为客户 ...
- JavaScript学习(三十六)—移动的小球
JavaScript学习(三十六)-移动的小球 代码如下: <!DOCTYPE html> <html lang="en"><head>< ...
最新文章
- pywinauto 记事本操作示例 移动鼠标 使用键盘 自动操作软件
- linux服务器密码策略,windows与linux服务器平台密码策略管理
- H标签对网站SEO优化是不可或缺的!
- how to export many stock data from Wind terminal
- 关于视频光端机调制方式及介质特点的介绍
- LeetCode —— 897. 递增顺序查找树(Python)
- Ubuntu 12.04下NFS安装配置图解
- 随想录(学校作业和工程代码)
- Longest Ordered Subsequence 最长上升子序列+DP
- go golang 判断base64数据 获取随机字符串 截取字符串
- webstorm更换主题后快捷键失效
- MVC进阶学习--HtmlHelper控件解析(五)
- Linux 查看端口状态 netstat
- 销售订单批量导入(1)
- 手机连接电脑DCIM目录下文件夹和图片显示不全
- deepin-wine下微信升级到最新版方法
- 如何做一个真正的男人
- 安装程序无法自动安装 Virtual Machine Communication Interface Sockets (VSock) 驱动程序,必须手动安装此驱动程序
- Java编程题小练习(初级):输入10个整数并进行排序输出。
- Simpack求解器说明
热门文章
- 物联网打工人必备:LiteOS Studio图形化调测能力
- 【Python3网络爬虫开发实战】1.3.3-pyquery的安装
- windows 查看网络中断事件_等保测评2.0:Windows安全审计
- java运行多个linux命令_在shell的一行中运行多个命令
- poj 3660 CwoContest Floyed传递闭包
- FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验
- 基于android的视频播放器,基于Android的视频播放器的设计与实现-.doc
- java swing 实现下拉列表点击事件
- Python文件读取(1.1)
- 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...