通过int []作为int递增

时间:2016-10-01 03:05:50

标签: java

因此,在作业中,我创建了一个方法,它将通过整数数组递增,就像它是一个整数一样。所以我的意思是int []的索引代表数字中的数字。

例如:

int[] digits;
digits = new int[4]

这将是一个4位数字。索引0是1000的位置,索引1是100的位置,索引2是10的位置,索引3是1的位置。 所以我通过这个数组递增的方法如下: 0000,0001 0002,0003,0004, - > 0010,00011,----> 9999。

public void increment(){

        if(digits[3] <= 8){
            digits[3]++;
        }
        else{
            digits[3] = 0;
            if(digits[2] <= 8){
                digits[2]++;
            }
            else{
                digits[2] = 0;;
                if(digits[1] <= 8){
                    digits[1]++;
                }
                else{
                    digits[1] = 0;
                    if(digits[0] <= 8){
                        digits[0]++;
                    }
                    else{
                        digits[0] = 0;
                    }
                }
            }
        }
    }

我的问题是如何制作一个做同样事情的方法,但该方法需要传入一个索引。

例如:

public void increment(int index){

      //increments through index number of digits.
}

这样的事情:

increment(7);

将产生:0000000,0000001,0000002,0000003, - &gt; 0000009,0000010,0000011,-----&gt; 9999999。

这是我个人满意的,所以任何帮助都会很棒=)

3 个答案:

答案 0 :(得分:0)

这是我的实施:

Live demo

参考示例:

[0,0]
[0,1]
[0,2]
[0,3]
[0,4]
[0,5]
[0,6]
[0,7]
[0,8]
[0,9]
[1,0]
[1,1]
[1,2]
[1,3]
[1,4]
[1,5]
[1,6]
...
  • 首先创建一个2D数组,其中每行代表一个带有n位数的数字。我们可以通过10 ^ n获得2D数组高度,因为我们有n个数字,每个数字有10种可能性(0-9)
  • 我们可以注意到生成的数字中的模式,即每一次迭代最右边的列切换数字,第二个最右边的数字每10次迭代切换数字,第三个数字每100次迭代切换数字等...所以第k个最右边的索引每10 ^ k次迭代迭代迭代。这由变量level表示。还可以省略对数字的一些迭代,因为我们知道某些数字在特定行之前不会增加(例如,如果n> 1,则最左边的数字不会增加第1行)。您可以通过执行log10(row)来获取要循环的数字宽度,这将为您提供整数row减去1的位数。这在代码中称为width
  • 然后我们需要做的就是检查现在是时候切换row%level == 0然后我们将值从上面的级别增加1,否则我们只是从上面的行复制相同的值

    public static void numbers(int n) {
            int nums[][] = new int[(int)Math.pow(10, n)][n];
            for(int row=1; row < nums.length; row++) {
                int width = (int) Math.log10(row);
                for(int col = nums[row].length-1; col >= nums[row].length-1-width; col--) {
                    int level = (int) Math.pow(10, n - col - 1);
                    if(row % level == 0) {
                        nums[row][col] = (nums[row-level][col]+1) % 10;
                    } else {
                        nums[row][col] = nums[row-1][col];
                    }
                }
                System.out.println(Arrays.toString(nums[row]));
            } 
    }
    

答案 1 :(得分:0)

除此之外:int [] = digits;是语法错误;删除=

increment例程需要访问数字数组,并且在Java数组中知道&#39;他们的界限,所以你不需要一个单独的参数或变量的长度。鉴于此,经典的黑客方法(从黑客意味着好的恐龙时代开始)是:

void increment (int[] digits){
    for( int i = digits.length; --i>=0 && ++digits[i]==10; ) digits[i]=0;
}
# alter the 10 to change radix, or make it variable if desired

这模仿了你在小学(或至少我做过)学到的程序:从最右边的数字开始,添加一个,如果它没有溢出你已经完成,如果它确实溢出改变它为零并向左移动一个位置,除非当你已经在左端时停止并且不能进一步移动。

答案 2 :(得分:0)

我认为以下内容简单易读:

public class Test{

    public static void main(String[] args){

        increment(7);
    }

    static void increment (int index){

        index = Math.abs(index) ;
        int[] digits = new int [index];
        Arrays.fill(digits, 0); //initialize array with 0

        for( int i = index-1; i>=0 ; i--) {//loop over all digits

            for(int digit = 0; digit <=9 ; digit++) {//increment each 

                digits[i] = digit;
                System.out.println(Arrays.toString(digits));
            }
        }
    }
}