java 36 进制_数学-在Java中如何将十进制数转换为以36为底的数字?

数学-在Java中如何将十进制数转换为以36为底的数字?

如果我有一个十进制数字,如何在Java中将其转换为以36为基数?

slavoj asked 2020-07-13T23:15:07Z

10个解决方案

75 votes

给定数字i,请使用Integer.toString(i, 36)。

Jeremiah Willcock answered 2020-07-13T23:15:18Z

16 votes

请参阅Integer.toString的文档

[HTTP://docs.Oracle.com/Java色/7/docs/API/Java/狼/integer.HTML#ToString(int,%20int)]

toString

public static String toString(int i, int radix)

....

The following ASCII characters are used as digits:

0123456789abcdefghijklmnopqrstuvwxyz

什么是radix? 您为Base 36感到幸运(这很有意义)

[HTTP://docs.Oracle.com/Java色/7/docs/API/Java/狼/character.HTML#max_radix]

public static final int MAX_RADIX 36

RichardTheKiwi answered 2020-07-13T23:15:51Z

14 votes

以下内容适用于任何基础,而不仅适用于36。只需替换code的String内容即可。

编码:

int num = 586403532;

String code = "0123456789abcdefghijklmnopqrstuvwxyz";

String text = "";

j = (int)Math.ceil(Math.log(num)/Math.log(code.length()));

for(int i = 0; i < j; i++){

//i goes to log base code.length() of num (using change of base formula)

text += code.charAt(num%code.length());

num /= code.length();

}

解码:

String text = "0vn4p9";

String code = "0123456789abcdefghijklmnopqrstuvwxyz";

int num = 0;

j = text.length

for(int i = 0; i < j; i++){

num += code.indexOf(text.charAt(0))*Math.pow(code.length(), i);

text = text.substring(1);

}

hcps-tenembasj answered 2020-07-13T23:16:19Z

9 votes

首先,您必须将其数字转换为Java的内部数字格式(碰巧是基于2的,但这在这里并不重要),例如long(如果您的数字是小于2 ^ 31的整数) 。 然后,您可以将其从Long转换为所需的输出格式。 方法BigInteger通过使用0123456789abcdefghijklmnopqrstuvwxyz作为数字(十进制数字0-9和字母顺序的小写英文字母)来完成此操作。 如果您需要其他一些数字,则可以通过替换“数字”来转换结果(例如toUpperCase),也可以自己进行转换-这不是魔术,只需将余数取模36再除以36( 查找正确的数字)。

如果您的电话号码长于int提供的电话号码,则可以改用long(与Long)或BigInteger一起使用,它们具有类似的基数转换器。

如果您的数字有“点后的数字”,则要困难一点,因为如果(Y的幂)不是,那么大多数(有限的)基X数不能精确地表示为(有限的)基Y数。 X的倍数。

Paŭlo Ebermann answered 2020-07-13T23:16:50Z

1 votes

此代码有效:

public class Convert {

public static void main(String[] args) {

int num= 2147483647;

String text="ABCD1";

System.out.println("num: " + num + "=>" + base10ToBase36(num));

System.out.println("text: " +text + "=>" + base36ToBase10(text));

}

private static String codeBase36 = "0123456789abcdefghijklmnopqrstuvwxyz";

//"0123456789 abcdefghij klmnopqrst uvwxyz"

//"0123456789 0123456789 0123456789 012345"

private static String max36=base10ToBase36(Integer.MAX_VALUE);

public static String base10ToBase36(int inNum) {

if(inNum<0) {

throw new NumberFormatException("Value "+inNum +" to small");

}

int num = inNum;

String text = "";

int j = (int)Math.ceil(Math.log(num)/Math.log(codeBase36.length()));

for(int i = 0; i < j; i++){

text = codeBase36.charAt(num%codeBase36.length())+text;

num /= codeBase36.length();

}

return text;

}

public static int base36ToBase10(String in) {

String text = in.toLowerCase();

if(text.compareToIgnoreCase(max36)>0) {

throw new NumberFormatException("Value "+text+" to big");

}

if(!text.replaceAll("(\\W)","").equalsIgnoreCase(text)){

throw new NumberFormatException("Value "+text+" false format");

}

int num=0;

int j = text.length();

for(int i = 0; i < j; i++){

num += codeBase36.indexOf(text.charAt(text.length()-1))*Math.pow(codeBase36.length(), i);

text = text.substring(0,text.length()-1);

}

return num;

}

}

frank answered 2020-07-13T23:17:09Z

1 votes

例如,如果您不想使用Integer.toString(Num,base),在我需要64位长的变量的情况下,可以使用以下代码:在JAVA中使用列表有助于此转换

long toBeConverted=10000; // example, Initialized by 10000

List charArray = new ArrayList();

List charArrayFinal = new ArrayList();

int length=10; //Length of the output string

long base = 36;

while(toBeConverted!=0)

{

long rem = toBeConverted%base;

long quotient = toBeConverted/base;

if(rem<10)

rem+=48;

else

rem+=55;

charArray.add((char)rem);

toBeConverted=quotient;

}

// make the array in the reverse order

for(int i=length-1;i>=0;--i){

if(i>=charArray.size()){

charArrayFinal.add((char) 48); // sends 0 to fix the length of the output List

} else {

charArrayFinal.add(charArray.get(i));

}

}

例:

(27,8197)36 =希纳布

Davood Falahati answered 2020-07-13T23:17:38Z

0 votes

这是将基数10转换为任何给定基数的方法。

public char[] base10Converter(int number, int finalBase) {

int quo;

int rem;

char[] res = new char[1];

do {

rem = number % finalBase;

quo = number / finalBase;

res = Arrays.copyOf(res, res.length + 1);

if (rem < 10) {

//Converting ints using ASCII values

rem += 48;

res[res.length - 1] = (char) rem;

} else {

//Convert int > 9 to A, B, C..

rem += 55;

res[res.length - 1] = (char) rem;

}

number /= finalBase;

} while (quo != 0);

//Reverse array

char[] temp = new char[res.length];

for (int i = res.length - 1, j = 0; i > 0; i--) {

temp[j++] = res[i];

}

return temp;

}

Nishant Jain answered 2020-07-13T23:17:58Z

0 votes

这对您有帮助。正在4位数字的字母数字字符串和1679615以下的十进制数字上执行该操作。您可以相应地修改代码。

char[] alpaNum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

String currentSeries = "";

int num = 481261;

String result = "";

String baseConversionStr = "";

boolean flag = true;

do

{

baseConversionStr = Integer.toString(num % 36) + baseConversionStr;

String position = "";

if(flag)

{

flag = false;

position = baseConversionStr;

}

else

{

position = Integer.toString(num % 36);

}

result += alpaNum[new Integer(position)];

num = num/36;

}

while (num > 0);

StringBuffer articleNo = new StringBuffer(result).reverse();

String finalString = "";

if(articleNo.length()==1)

{

finalString = "000"+articleNo;

}

else if(articleNo.length()==2)

{

finalString = "00"+articleNo;

}

else if(articleNo.length()==3)

{

finalString = "0"+articleNo;

}

currentSeries = finalString;

Omkar More answered 2020-07-13T23:18:18Z

0 votes

我从这个网站上用JavaScript获得了这段代码,这是我在Java中的版本:

public static String customBase (int N, String base) {

int radix = base.length();

String returns = "";

int Q = (int) Math.floor(Math.abs(N));

int R = 0;

while (Q != 0) {

R = Q % radix;

returns = base.charAt(R) + returns;

Q /= radix;

}

if(N == 0) {

return String.valueOf(base.toCharArray()[0]);

}

return N < 0 ? "-" + returns : returns;

}

这支持负数和自定义基数。

十进制插件:

public static String customBase (double N, String base) {

String num = (String.valueOf(N));

String[] split = num.split("\\.");

if(split[0] == "" || split[1] == "") {

return "";

}

return customBase(Integer.parseInt(split[0]), base)+ "." + customBase(Integer.parseInt(split[1]), base);

}

nathanfranke answered 2020-07-13T23:18:46Z

0 votes

也许我迟到了聚会,但这是我用来通过其索引获取Calc / Excel单元格名称的解决方案:

public static void main(final String[] args) {

final String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

System.out.println(toCustomBase(0, base));

System.out.println(toCustomBase(2, base));

System.out.println(toCustomBase(25, base));

System.out.println(toCustomBase(26, base));

System.out.println(toCustomBase(51, base));

System.out.println(toCustomBase(52, base));

System.out.println(toCustomBase(520, base));

}

public static String toCustomBase(final int num, final String base) {

final int baseSize = base.length();

if(num < baseSize) {

return String.valueOf(base.charAt(num));

}

else {

return toCustomBase(num / baseSize - 1, base) + base.charAt(num % baseSize);

}

}

结果:

A

C

Z

AA

AZ

BA

TA

基本上,该解决方案接受任何自定义基数。 这个想法是从这里抢占的。

akaine answered 2020-07-13T23:19:15Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值