从0到99999之间的数字中提取数字

时间:2016-12-24 16:32:01

标签: java arrays sorting

我现在在一个程序中工作,我需要对0到99999之间的数字数组进行排序。为了做到这一点,任务的一部分是从数组的每个数字中提取数字,并且

可以完成
i = number / digit. 

例如,对于数字23456,我应该从提取数字2开始,这可以通过使用

来完成
digit = 10000 

并计算

i = 23456 / 10000 = 2. 

然后一个递归调用应该查看下一个数字,所以在这种情况下我们想得到

i = 23456 / digit = 3 

等等。我知道有一些方法可以解决这个问题,但是如何只使用原始方法呢?我已经尝试过模数和分割数字,但它没有给出任何想要的结果。

4 个答案:

答案 0 :(得分:3)

基本公式

非负的积分十进制数的n位数可以通过以下公式提取:

digit = ((num % 10^n) / 10^(n-1))

其中%表示模除法,/表示整数除法,^表示此示例中的取幂。请注意,对于此公式,数字从1(非0)开始索引LSD-> MSD。

通过将10更改为所需的基数,此公式也适用于非十进制数(例如,基数16)。如果采用最终数字的绝对值,它也适用于负数。最后,它甚至可以通过在将浮点数传递给整数之前将浮点数截断并转换为整数来提取浮点数的整数位(但不是小数位)。

递归算法

因此,要以MSD-> LSD的顺序递归提取一定长度的所有数字,您可以使用以下Java方法:

static public void extractDigits(int num, int length) {
    if (length <= 0) {  // base case
        return;
    }
    else {  // recursive case
        int digit = (num % (int)Math.pow(10,length)) / (int)Math.pow(10,length-1);
        /* do something with digit here */
        extractDigits(num, length-1);  // recurse
    }
}

此方法永远不会除以零。

注意:为了“在这里使用数字做某事”,您可能需要传入一个额外的参数(例如,如果您想将数字添加到列表中)。

优化

由于您的目标是从数字中提取每个数字,而不是仅提取一个特定数字(如基本公式所假设的),因此可以优化此算法以按照LSD->的顺序提取数字。 MSD以避免在每一步都需要取幂。 (这种方法由@AdityaK给出here原文...如果您使用它,请点赞它们)

static public void extractDigits(int num) {
    if (num == 0) {  // base case
        return;
    }
    else {  // recursive case
        int digit = num % 10;
        /* do something with digit here */
        extractDigits(num / 10);  // recurse
    }
}

注意:在将任何负数传递给此方法之前,应将其转换为正数。

答案 1 :(得分:1)

这里是递归从整数中提取数字的代码。它将以相反的顺序。

import java.util.*;

public class HelloWorld{

     static void extractNumbers(int n, List<Integer> l) {
         if(n==0)
         return;
         else {
             l.add(n%10);
             extractNumbers(n/10, l);
         }
     }
     public static void main(String []args){
         List<Integer> result = new ArrayList<Integer>();
         extractNumbers(456789,result);
        System.out.println(result);
     }
}

希望它有所帮助。

答案 2 :(得分:0)

我会这样做: -

public static void main (String[] args) throws java.lang.Exception
{
    // your code goes here
    int num=23456;
    int numSize=5;
    rec(num,numSize);
}

public static void rec(int num, int numSize){
    if(numSize==0)
        return;
    int divideBy=(int)Math.pow(10,(numSize-1));
    int out=(int)(num/divideBy);
    System.out.println(out);
    rec((num-out*divideBy),(numSize-1));
    return;
}

请参阅此处的输出:http://ideone.com/GR3l5d

答案 3 :(得分:0)

通过将数组元素转换为字符串来使用for循环可以轻松完成。

var arr = [234, 3456, 1234, 45679, 100];

var compare = function(val1, val2) {
  return val1 - val2;
};
arr.sort(compare); //sort function
var extract = function(value, index) {

  var j = "";

  var element = value + "";

  for (var i in element) {
    var val = element[i];
    console.log(parseInt(val)); // this prints the single digits from each array elements
    j = j + " " + val;
  }
  alert(j);
};
arr.forEach(extract); //extract  function..