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