分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
今天的研究成果。原文看这里:JAVA获得数字(正数和倒数)第几位是什么的方法
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范围内的位置。<br>
- * 比如0-9就在第0位<br>
- * 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