Summe der Ziffern einer Zahl EFFIZIENT berechnen?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

Java bietet im Gegensatz zu anderen Sprachen ja keinen Zugriff auf die Ziffern eines Integers.
Das Umwandeln in String kostet IMHO aber sehr viel Zeit.

Hier ein Demo Programm:
Code:
public class Demo {
	public static void main(String[] args) {
		new Demo().run();
	}
	
	public void run(){
		long start = System.currentTimeMillis();
		
		for(int i=1;i<20000000;i++){
			getSum(i);
		}		
		System.out.println((System.currentTimeMillis()-start)/1000+" Sekunden");
	}
	
	
	public int getSum(int zahl){
		int sum = 0;
		String s = String.valueOf(zahl);
		for(int i=0;i<s.length();i++){
			sum = sum + Integer.parseInt(s.substring(i, i+1));
		}
		return sum;
	}
}
Das dauert bei mir ca. 15 Sekunden.

Kann man das anders machen und geht das schneller?
 
S

SlaterB

Gast
du kannst aus dem String die Zeichen mit charAt() rausholen,
dann noch minus '0' und nach int umwandeln oder direkt mit dem char rechnen,

schonmal schneller als das parseInt()

---------

wenn du direkt mit der Zahl rechnen willst, dann verwende % 10 und / 10, um per Rechnung an die einzelnen Ziffern zu kommen
 
G

Guest

Gast
Ok,

das bringt schon mal einiges:
Code:
public class Demo {
	public static void main(String[] args) {
		new Demo().run();
	}
	
	public void run(){
		long start = System.currentTimeMillis();

		
		for(int i=1;i<20000000;i++){
			getSum(i);
		}		
		System.out.println((System.currentTimeMillis()-start)/1000+" Sekunden"); 
	}
	
	
	public int getSum(int zahl){
		int sum = 0;
		String s = String.valueOf(zahl);
		for(int i=0;i<s.length();i++){
			sum = sum + s.charAt(i)-48;
		}
		return sum;
	}
}

Das dauert nur noch ca. 3 Sekunden. Gehts noch schneller?
 
S

SlaterB

Gast
ist allerdings bisschen langsamer, bei mir recht genau 6 Sekunden

gehts eigentlich um die reine Zählleistung oder reicht dir auch ne Formel?

max * 17/ x2 = fertig

-------


eine Zwischenlösung wäre wohl, statt jedes mal einen neuen String zu erzeugen, ein char-Array anzulegen und da nur die passenden chars auszutauschen,

['0','0','3']

->

['0','0','4']

->
['0','0','5']



der Übergang zur Formelrechnung ist dann langsam fließend
 

Ariol

Top Contributor
Code:
public int getSum(int zahl){
      int sum = 0;
      for(;zahl > 0; zahl/=10)
      {
    	  sum += zahl%10;
      }
      return sum;
   }
 

Landei

Top Contributor
Code:
public class Quersumme {

  private final static int[] SUM = new int[] {
      0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
      2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
      3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
      2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
      3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
      3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
      6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
      8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
      17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
      9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
      10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
      11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
      12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
      14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
      17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
      18, 19, 20, 21, 22, 23, 24, 25, 26, 27
  };

  public static int quersumme(int zahl) {
    int sum = 0;
    while (zahl > 0) {
      sum += SUM[zahl % 1000];
      zahl /= 1000;
    }
    return sum;
  }

  public static void main(String ...args) {
    System.out.println(quersumme(1234567));
  }
}
 
S

SlaterB

Gast
ob wohl ein switch schneller ist als ein Array-Zugriff?
bitte ausprobieren ;)

das müsste man tatsächlich programmieren, das Array hätte man auch dynamisch füllen lassen können
(ok, den Quellcode für das switch kann auch ein Programm schreiben)
 

Landei

Top Contributor
Eine andere Idee wäre, die letzte Ziffer ohne % zu ermitteln:
Code:
 private static int lastDigit(int zahl) {
     int hex = zahl & 0xF;
     switch(hex) {
     case 10 : return 0;
     case 11 : return 1;
     case 12 : return 2;
     case 13 : return 3;
     case 14 : return 4;
     case 15 : return 5;
     default: return hex;
     }
 }
 

Der Müde Joe

Top Contributor
>Eine andere Idee wäre, die letzte Ziffer ohne % zu ermitteln:

Code:
		int sum = 0;
		int temp;
		while (zahl > 0) {
			temp = zahl / 10; //div 10
			sum += (zahl - (temp << 3) - (temp << 1)); //orig - (temp * 10)
			zahl = temp;
		}

recht schnell..auf der idee von Marco13 bzw aus Long (hingegen ohne Tabelle)
 

Landei

Top Contributor
Hab auch gerade gemerkt, dass mein Code nicht ging...

Aber man könnte beides kombinieren... Also so eine Formel für %1000, und dann in meinem Array nachgucken.
 

Landei

Top Contributor
Funktioniert:
Code:
  public static int quersumme(int zahl) {
    int sum = 0;
    while (zahl > 0) {
      int temp = zahl / 1000;
      sum += SUM[zahl - (temp << 10) + (temp << 4) + (temp << 3)];
      zahl = temp;
    }
    return sum;
  }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
S 100 als Summe Java Basics - Anfänger-Themen 16
I For Schleife Summe berechnen Java Basics - Anfänger-Themen 13
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
Ninum Summe Java Basics - Anfänger-Themen 3
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
N 2D Array Summe erstellen Java Basics - Anfänger-Themen 6
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
L Max, min, Summe und Durchschnitt berechnen Java Basics - Anfänger-Themen 4
R Summe Java Basics - Anfänger-Themen 13
M Array Summe bestimmen? Java Basics - Anfänger-Themen 14
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
A Summe des Arrays pd mit alternativer Schleife Java Basics - Anfänger-Themen 2
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
F Summe in einem Array bestimmen Java Basics - Anfänger-Themen 3
N Quadratische Matrix inkl Summe Java Basics - Anfänger-Themen 8
F Summe aller echten Teiler Java Basics - Anfänger-Themen 2
F Summe aller echten Teiler und Zahlen zurückgeben Java Basics - Anfänger-Themen 1
M Array Summe- wo ist der Fehler ? Java Basics - Anfänger-Themen 13
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
A Summe aller ungeraden Zahlen Java Basics - Anfänger-Themen 5
J ArrayList: summe aller Spielkarten Java Basics - Anfänger-Themen 15
K Methode: Summe von n Zahlen Java Basics - Anfänger-Themen 24
S Summe aus Kombinationen /permutationen einer Liste mit einer Obergrenze Java Basics - Anfänger-Themen 10
P Altklausur: Abfrage der Summe Java Basics - Anfänger-Themen 9
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
B summe von 2 Matrizen Java Basics - Anfänger-Themen 20
V Input/Output ArrayList Summe ausgeben Java Basics - Anfänger-Themen 57
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
L Array: Summe aller geraden und ungeraden Zahlen ermitteln Java Basics - Anfänger-Themen 9
Joew0815 summe aus einem aarray Java Basics - Anfänger-Themen 4
B Summe aller Zahlen von 1 bis zu dieser Zahl (ohne while oder for schleife) Java Basics - Anfänger-Themen 4
E Summe der "Nachbarn" eines Wertes in einem Array bestimmen Java Basics - Anfänger-Themen 8
P Schleife zur Berechnung von einer Summe Java Basics - Anfänger-Themen 16
G Rekursion Summe Java Basics - Anfänger-Themen 15
D Summe von Eingaben in einer for Schleife Java Basics - Anfänger-Themen 4
J Summe mit 45 nachkommastellen Java Basics - Anfänger-Themen 8
D Summe aller Positiven Integer aus einer Liste mit ActionObject Java Basics - Anfänger-Themen 2
V Programm summe Java Basics - Anfänger-Themen 11
I Summe eines Arrays ohne Schleife Java Basics - Anfänger-Themen 4
C Summe berechnen Java Basics - Anfänger-Themen 22
A Summe aller Natürlichen Zahlen - Methode Prüfen Java Basics - Anfänger-Themen 10
D Pyramide: Summe der diagonal über ihr stehenden Zahlen! Java Basics - Anfänger-Themen 6
A summe von m bis n mit for-Schleife Java Basics - Anfänger-Themen 5
M array - summe quer Java Basics - Anfänger-Themen 9
J summe von aufeinander folgenden floats eines arrays Java Basics - Anfänger-Themen 10
B array bestimmte summe berechnen Java Basics - Anfänger-Themen 4
S Summe Berechnen Java Basics - Anfänger-Themen 6
S Summe von Zufallszahlen Java Basics - Anfänger-Themen 9
Z Summe von Vektor-Elementen Java Basics - Anfänger-Themen 5
E Array gebildete Summe ausgeben Java Basics - Anfänger-Themen 5
D 100.0% gleichmäßig aufteilen, so dass Summe 100.0% sind, nicht 99,9% oder 100,1% Java Basics - Anfänger-Themen 3
M Rekursion Summe vom Array Java Basics - Anfänger-Themen 2
W sin-funktion x-wert der summe approximieren Java Basics - Anfänger-Themen 2
M Summe eines Arrays Java Basics - Anfänger-Themen 2
U Summe produkt von einem array Java Basics - Anfänger-Themen 9
J Summe postive Zahlen und negative Zahlen Java Basics - Anfänger-Themen 12
J matrix nach summe der spalten sortieren Java Basics - Anfänger-Themen 5
Antoras Zahlen mischen und mit einer for-Schleife Summe berechnen Java Basics - Anfänger-Themen 12
G Summe zweier doubles falsch? Java Basics - Anfänger-Themen 10
G Md5 Summe eines Fileobjektes bilden Java Basics - Anfänger-Themen 4
G JTable Zwischenüberschriften bzw. Summe? Java Basics - Anfänger-Themen 2
L Berechnung Summe Java Basics - Anfänger-Themen 3
A String in Zahlen/Summe umformen Java Basics - Anfänger-Themen 2
R Summe Iterative Java Basics - Anfänger-Themen 6
S Summe innerhalb eines arrays? Java Basics - Anfänger-Themen 2
M summe von squares Java Basics - Anfänger-Themen 3
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
obiwanke Ziffern durch ASCII Character ersetzen Java Basics - Anfänger-Themen 8
M LCD-Ziffern-Hilfe Java Basics - Anfänger-Themen 6
Marlena Bauer LCD Ziffern Java Basics - Anfänger-Themen 13
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
I Arabische Ziffern in römische Ziffern Java Basics - Anfänger-Themen 1
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
C Datentypen String aus Ziffern erhöhen und als String zurückgeben Java Basics - Anfänger-Themen 16
P vokale konsonanten ziffern satzzeichen aus string lesen. hab kiene ahnung Java Basics - Anfänger-Themen 10
E String bestehend aus Ziffern in Zahl verwandeln Java Basics - Anfänger-Themen 3
W Methoden Ausgabe true wenn nur Ziffern <= 1 vorhanden Java Basics - Anfänger-Themen 9
J Skalierung von Ziffern Java Basics - Anfänger-Themen 10
K wiederholung von ziffern Java Basics - Anfänger-Themen 3
K double-Wert aus einzelnen Ziffern erzeugen Java Basics - Anfänger-Themen 7
T Ziffern anordnen Java Basics - Anfänger-Themen 3
P Arabische (indische) Ziffern Java Basics - Anfänger-Themen 4
M Methode für nur Ziffern?? Java Basics - Anfänger-Themen 3
B Auf die Ziffern einer Zahl zugreifen Java Basics - Anfänger-Themen 6
C Rekursive Methode - Ziffern in Zahl Java Basics - Anfänger-Themen 33
Haave EAN-13-Prüfziffer: Vermeiden von Eingaben mit mehr/weniger als 12 Ziffern Java Basics - Anfänger-Themen 3
G 9-stellige Zahl mit den Ziffern 1-9 Java Basics - Anfänger-Themen 2
D Einzelne Ziffern aus einem String Java Basics - Anfänger-Themen 10
N Wie kann ich Ziffern einer eingegenen Zahl adressieren? Java Basics - Anfänger-Themen 6
B Ziffern erkennung Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben