50:数学序列中某个的数字

深碍√TFBOYSˉ_ 2022-11-27 06:52 90阅读 0赞

数学序列中某个的数字

数字以0123456789101112131415161718…的格式序列化到一个字符序列中。在这个序列中,第5位是5,
第13位是1,第19位是4。实现一个函数,求任意第n位对应的数字。

  1. public class Offer50 {
  2. public static void main(String[] args) {
  3. int digit = new Offer50().digitAtIndex(13);
  4. System.out.println(digit);
  5. }
  6. //n的范围:
  7. // 0~9: 10
  8. // 10~99: 90*2
  9. // 100~999: 900*3
  10. // 1000~9999: 9000*4
  11. // nnn~mmm: 9*(10^位数-1)*位数
  12. public int digitAtIndex(int index){
  13. if(index<0)return -1;
  14. //m = 位数
  15. int m = 1;
  16. while (true){
  17. //计算m位数的个数
  18. int number = numbersOfIntegers(m);
  19. if(index<number)
  20. return getDigit(index,m);
  21. //减去m的位数
  22. index-=number;
  23. m++;
  24. }
  25. }
  26. /* * 返回m位数的总个数 * 例如,两位数一共有90*2个:10~99;三位数有900*3个:100~999 */
  27. private int numbersOfIntegers(int m) {
  28. if(m==1)
  29. return 10;
  30. return (int) (9*Math.pow(10, m-1)*m);
  31. }
  32. /* * 获取数字 */
  33. private int getDigit(int index, int m) {
  34. // 所在的数字,index/m =数字所在的位数
  35. int number=getFirstNumber(m)+index/m; //对应的m位数
  36. // 第几位数
  37. int indexFromRight = m-index%m;
  38. //将数字放到最低位
  39. for(int i=1;i<indexFromRight;i++)
  40. number/=10;
  41. return number%10;
  42. }
  43. /* * 第一个m位数 */
  44. private int getFirstNumber(int m) {
  45. if(m==1)
  46. return 0;
  47. return (int) Math.pow(10, m-1);
  48. }
  49. }

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数学推导】数字变换

    题目描述 Alice 给了 Bob 一个数 k,求有多少个数 x,满足:从 x 的某个数位(不能是最后一位)后加一个乘号,运算得到一个数 y,使得 x−y=k。 比如: