java 正数_JAVA获得数字(正数和倒数)第几位的几种方法总结和对比 | 学步园

本文介绍了多种在JAVA中获取数字最后或正数第几位的方法,包括直接除法、字符串转换和字典查找,并通过性能测试对比了不同方法的效率。
摘要由CSDN通过智能技术生成

JAVA获得某个数字的最后第几位是什么的方法,比如,1234567890,则获得最后第三位,则返回8

/**

* 获得数字(正数和倒数)第几位是什么的方法。

*

* @author 老紫竹研究室(laozizhu.com)

*

*/

public class Test {

// 字典,里面保存的是1,10,100,1000..直到long的最大允许位数

private static final long[] NUMBERS = new long[19];

static {

NUMBERS[0] = 1;

for (int i = 1; i < 19; i++) {

NUMBERS[i] = NUMBERS[i - 1] * 10;

}

}

public static void main(String[] args) {

long number = 1234567890123456789L;

System.out.println("测试取得倒数第几位");

System.out.println(getNumberAtLast(number, 3));

System.out.println(getNumberAtLast2(number, 3));

System.out.println(getNumberAtLast3(number, 3));

int total = 1000000;

long begin = System.nanoTime();

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

getNumberAtLast(number, 3);

}

System.out.println("getNumberAtLast =" + (System.nanoTime() - begin));

begin = System.nanoTime();

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

getNumberAtLast2(number, 3);

}

System.out.println("getNumberAtLast2=" + (System.nanoTime() - begin));

begin = System.nanoTime();

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

getNumberAtLast3(number, 3);

}

System.out.println("getNumberAtLast3=" + (System.nanoTime() - begin));

System.out.println("测试取得正数第几位");

System.out.println(getNumberAtFirst(number, 3));

System.out.println(getNumberAtFirst2(number, 3));

begin = System.nanoTime();

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

getNumberAtFirst(number, 3);

}

System.out.println("getNumberAtFirst =" + (System.nanoTime() - begin));

begin = System.nanoTime();

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

getNumberAtFirst2(number, 3);

}

System.out.println("getNumberAtFirst2=" + (System.nanoTime() - begin));

}

/**

* 获得数字的倒数第几位是什么

*

* @param number

* 数字

* @param index

* 位置

* @return 位置上的数字,如果超过了则返回0

*/

public static int getNumberAtLast(long number, int index) {

for (; index > 1; index--) {

number /= 10;

}

return (int) (number % 10);

}

/**

* 用字符串的方式进行获得。

*

* @param number

* 数字

* @param index

* 位置

* @return 位置上的数字,如果超过了则返回0

*/

public static int getNumberAtLast2(long number, int index) {

String str = Long.toString(number);

if (str.length() < index) {

return 0;

}

return str.charAt(str.length() - index) - 0x30; // 数字0的字符形式

}

/**

* 通过字典查找倒数第几个数字

*

* @param number

* 数字

* @param index

* 位置

* @return 位置上的数字,如果超过了则返回0

*/

public static int getNumberAtLast3(long number, int index) {

return (int) ((number / (NUMBERS[index - 1])) % 10);

}

/**

* 通过字典获得数字的正数第几位是什么

*

* @param number

* 数字

* @param index

* 位置

* @return 位置上的数字,如果超过了则返回0

*/

public static int getNumberAtFirst(long number, int index) {

int place = getNumberIndex(number);

number /= NUMBERS[place - index + 1];

return (int) (number % 10);

}

/**

* 通过字符串获得数字的正数第几位是什么

*

* @param number

* 数字

* @param index

* 位置

* @return 位置上的数字,如果超过了则返回0

*/

public static int getNumberAtFirst2(long number, int index) {

String str = Long.toString(number);

return str.charAt(index - 1) - 0x30; // 数字0的字符形式

}

/**

* 根据字典得到某个数字在long范围内的位置。

* 比如0-9就在第0位

* 10-99 就在第1位。

*

* @param number

* 数字

* @return 位置

*/

private static final int getNumberIndex(long number) {

return getNumberIndexR(number, 0, 19);

}

/**

* 简单的二分查找法,查找某个数字在字典中的位置

*

* @param number

* @param left

* @param right

* @return

*/

private static final int getNumberIndexR(long number, int left, int right) {

if (right <= left + 1) {

return left;

}

int mid = (right - left) / 2 + left;

if (NUMBERS[mid] > number) {

return getNumberIndexR(number, left, mid);

} else {

return getNumberIndexR(number, mid, right);

}

}

}

运行结果:

测试取得倒数第几位

7

7

7

getNumberAtLast =74142943

getNumberAtLast2=379321953

getNumberAtLast3=37117566

测试取得正数第几位

3

3

getNumberAtFirst =136200830

getNumberAtFirst2=375250207

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值