2016-10-01 6 views
0

Also während einer Hausaufgabe habe ich eine Methode gemacht, die durch ein Integer-Array inkrementiert, als ob es eine ganze Zahl wäre. Was ich damit meine ist, dass der Index von int [] die Ziffern in einer Zahl darstellen würde.Inkrementieren durch int [] als int

zum Beispiel:

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

wäre dies eine 4-stellige Zahl. Index 0 ist der Platz der 1000, Index 1 ist der Platz der 100, Index 2 ist der Platz der 10 und Index 3 ist der Platz der 1. So ist die Methode, die ich Schritte durch dieses Array wie folgt aus: 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; 
        } 
       } 
      } 
     } 
    } 

Meine Frage ist, wie würde ich gehe über ein Verfahren zu machen, die das gleiche tut, aber das Verfahren erfordert einen Index in weitergegeben werden

zum Beispiel:.

public void increment(int index){ 

     //increments through index number of digits. 
} 

So etwas wie folgt aus:

increment(7); 

würde dies ergeben: 0000000, 0000001, 0000002, 0000003, -> 0000009, 0000010, 0000011, -----> 9999999

Dies ist persönlich für meine eigene Zufriedenheit, so würde jede mögliche Hilfe groß sein =)

+1

int-Array mit einer Anforderung? Ist es nicht viel einfacher, einen einzelnen Zähler zu haben und die Zahl mit aufgefüllten Nullen auszugeben? –

+0

versuchen Sie es rekursiv – codemirel

Antwort

0

Hier ist meine Implementierung:

Live demo

Referenzbeispiel:

[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] 
... 
  • Erstellen Sie zuerst ein 2D-Array, wobei jede Zeile eine Zahl mit n Ziffern darstellt. Wir können die 2D-Array-Höhe durch Ausführen von 10^n erhalten, da wir n Ziffern und 10 Möglichkeiten für jede Ziffer haben (0-9)
  • Wir können ein Muster in den generierten Zahlen feststellen, das ist die rechte Spalte schaltet die Ziffer jede Iteration , die zweite Ziffer ganz rechts schaltet die Ziffer alle 10 Iterationen, die dritte schaltet die Ziffer jede 100 Iteration usw. um, so dass der k-te Index ganz rechts die Iteration alle 10^Iterationen schaltet. Dies wird durch die Variable level notiert. Auch einige Iterationen auf den Ziffern können weggelassen werden, weil wir wissen, dass einige Ziffern nicht bis zu einer bestimmten Zeile zunehmen (Beispiel: die am weitesten links stehende Ziffer wird nicht für Zeile 1 erhöht, wenn n> 1). Sie können die Breite der Ziffern für die Schleife erhalten, indem Sie log10(row) eingeben. Dadurch erhalten Sie die Anzahl der Stellen in der Ganzzahl row minus eins. Dies wird im Code width genannt.
  • Dann müssen wir nur überprüfen, ob es jetzt Zeit ist, um row%level == 0 zu wechseln dann erhöhen wir den Wert von oben Ebene um eins, sonst kopieren wir einfach den gleichen Wert aus Zeile darüber.

    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])); 
         } 
    } 
    
+0

Mit diesem können Sie auf jede einzelne Nummer zugreifen? zum Beispiel war meine Hausaufgabe, ein Programm zu schreiben, das eine Nummer erzeugen würde, die bestimmte Bedingungen erfüllte: Alle 4 Ziffern müssen unterschiedlich sein, alle Ziffern müssen gleich 27 sein, die Nummer muss ungerade sein und die Nummer in der 1000er Stelle ist 3 mal die Nummer in den 10er Jahren. Ich habe eine Reihe von if-Anweisungen verwendet, um auf bestimmte Indizes im Array zu zeigen. –

+0

Nein, dies funktioniert nicht mit Bedingungen. Die Frage erwähnt das nicht, daher werden alle Antworten hier nicht berücksichtigt. Ich schlage vor, dass Sie für jede Bedingung eine andere Frage erstellen, weil Sie jeden Fall effizient lösen können, indem Sie mathematische Berechnungen (Kombination und Permutationen) verwenden, um die Länge des Ergebnisses zu erraten. – CMPS

0

Abgesehen: int [] = digits; ist ein Syntaxfehler; Entfernen Sie die =.

Die increment Routine benötigt Zugriff auf das Array von Ziffern und in Java-Arrays "kennen" ihre Grenzen, so dass Sie keinen separaten Parameter oder eine Variable für die Länge benötigen. Da die klassische Hacker-Methode (von der Zeit der Dinosaurier, wenn Hacker bedeutete gut) ist:

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 

Dies ahmt die Prozedur, die Sie in der Grundschule gelernt (oder zumindest habe ich): Start an der Stelle ganz rechts , füge eins hinzu, wenn es nicht überläuft, bist du fertig, wenn es überläuft, ändere es auf Null und bewege dich um einen Platz nach links, außer halt, wenn du bereits am linken Ende bist und kannst dich nicht weiter bewegen.

0

Ich denke, die folgende ist ruhig einfach und lesbar:

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)); 
      } 
     } 
    } 
}