Erste Schritte Hausaufgaben-Prob. - Iterative Prog. Zahlen aufsummieren, wenn durch k>0 teilbar.

Foxtrot

Mitglied
Hallo liebes Board!

Studiere nun Wirtschaftsinformatik und mache gerade meine ersten Schritte in Java. Doch leider hänge ich seit ca. 2,5 Stunden an folgenden Problem: :oops:

Aufgabe:
Zahlen von m bis einschließlich n aufsummieren, falls diese durch k>0 teilbar sind.

Z.B.:
int sumDivisible (int m, int n, int k) -> m= 1, n=10, k=3; -> 3 + 6 + 9 = 18
(da 3, 6, 9 ohne Rest durch 10 teilbar).

Folgendes habe ich bereits geschrieben: :rolleyes:

public static void main(String[] args) {
// 3 + 6 + 9 = 18

int start = 1;
int wert = start - 1;

for(int i=wert; i<10; i++) {
wert = wert + 1;

if((wert % 3) == 0) {
int ok = wert;
System.out.println(ok);
...

Ich "filtere" somit die 3 benötigten Zahlen (3, 6, 9) heraus. - Jetzt müsste ich diese aber irgendwie summieren, damit ich auf das Ergebnis 18 komme.

Hat jemand eine Idee? - Würde mir sehr helfen!

Danke! :)
 

klauskarambulut

Bekanntes Mitglied
Zahlen von m bis einschließlich n aufsummieren, falls diese durch k>0 teilbar sind.
Schritt 1:
Java:
//Zahlen von m bis einschließlich n
for(int zahl = m; zahl <=n; zahl++) {

}

Schritt 2:
Java:
for(int zahl = m; zahl <=n; zahl++) {
  //falls durch k>0 teilbar
  if(zahl % k == 0) {
    // hier kommt das rein, was in diesem Fall passieren soll
  }
}

Schritt 3:
Java:
// startwert auf den aufsummiert werden soll
int summe = 0;
for(int zahl = m; zahl <=n; zahl++) {
  if(zahl % k == 0) {
    // aufsummieren
    summe = summe + zahl;
  }
}

Schritt 4:
Java:
public static void main(String...args) {
//  Werte für n,m,k setzen
  int n = ?;
  int m = ?;
  int k = ?;
  int summe = 0;
  for(int zahl = m; zahl <=n; zahl++) {
    if(zahl % k == 0) {
      summe = summe + zahl;
    }
  }
  System.out.println("Summe: "+summe);
}

Schritt 5:
Java:
public static void main(String...args) {
  int n = ?;
  int m = ?;
  int k = ?;
  // Funktion extrahieren
  int result = sumDivisible (m, n, k);

  System.out.println("Summe: "+result);
}

public static int sumDivisible(int m, int n, int k) {  
  int summe = 0;
  for(int zahl = m; zahl <=n; zahl++) {
    if(zahl % k == 0) {
      summe = summe + zahl;
    }
  }
  return summe;
}
 

strußi

Top Contributor
eigentlich kannst du alle zahlen die >k sind aufsummieren da nicht steht, ohne rest teilbar ;-)
am besten gibst du beide lösungen ab
 

klauskarambulut

Bekanntes Mitglied
Wenn man noch Klugscheißen möchte, dann kann man auch noch sowas machen.
Java:
  public static int sumDivisibleAlt(int m, int n, int k) {
        int from = (m + ((k - (m % k)) % k)) / k;
        int to = (n - (n % k)) / k;
        if (from > to) {
            return 0;
        }
        int diff = to - from + 1;
        return (diff * (to + from) * k) / 2;
    }

Anhand des Beispiels 1, 10 und 3 unter Anwendung grundlegender mathematischer Kenntnisse und der Gaußschen Summenformel. (Früher wohl Realschulniveau)

ist 3 + 6 + 9 nichts anderes als k ( 1+ 2 + 3)

1 + 2 + 3 ist mit der Gaußschen Summenformel berechenbar.

Jetzt muss man nur noch die erste und die letzte Teilbare Zahl finden, wobei modulo hilft und diese durch 3 Teilen und bekommt damit die from und to Werte.

Testen ob es überhaupt was zum Summieren gibt.
Zahlen via Gauß aufsummieren und mit k multiplizieren und man hat das korrekte Ergebnis in Windeseile.

Gegengetestet via Property-Based-Testing mit einer Million Varianten ;)
Läuft immer sauber durch. Spart man sich also die Schleife, was um einiges besser performt.

Java:
public class Summs {

    public static void main(String[] args) {
        java.util.Random r = new java.util.Random();
        for (int i = 0; i < 1000000; i++) {
            int m = r.nextInt(10000);
            int n = r.nextInt(10000);
            int k = r.nextInt(100)+1;

            int rA = sumDivisible(m, n, k);
            int rB = sumDivisibleAlt(m, n, k);
            if (rA != rB) {
                System.out.printf("Error for %d %d %d expected<%d> got <%d>%n", m, n, k, rA, rB);
            }
        }

    }

    public static int sumDivisible(int m, int n, int k) {
        int summe = 0;
        for (int zahl = m; zahl <= n; zahl++) {
            if (zahl % k == 0) {
                summe = summe + zahl;
            }
        }
        return summe;
    }

    public static int sumDivisibleAlt(int m, int n, int k) {
        int from = (m + ((k - (m % k)) % k)) / k;
        int to = (n - (n % k)) / k;
        if (from > to) {
            return 0;
        }
        int diff = to - from + 1;
        return (diff * (to + from) * k) / 2;
    }
}

200 Mio. Iteration laufen bei mir mit dem schleifenlosen Ansatz in knapp 6 Sekunden durch.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Info Hausaufgaben Java Basics - Anfänger-Themen 2
V Könnt ihr mal über Paar antworten schauen(Hausaufgaben) Java Basics - Anfänger-Themen 7
H Kleines Prob Java Basics - Anfänger-Themen 5
K Erste Schritte prob mit DefaultListModel (string) Java Basics - Anfänger-Themen 8
K Erste Schritte prob anzeige Java Basics - Anfänger-Themen 4
F Button array prob Java Basics - Anfänger-Themen 7
K Prob. mit einer Fehlermeldung Java Basics - Anfänger-Themen 7
S OOP ArrayList Klasse nachbauen, prob mit remove Java Basics - Anfänger-Themen 5
G Prob. mit KeyListener und Unterklasse Java Basics - Anfänger-Themen 5
J Doppelte Integer aus einem Array entfernen - seltsames Prob. Java Basics - Anfänger-Themen 5
G hibernate . tutorial prob . Java Basics - Anfänger-Themen 4
S prob mit add in einer arry list Java Basics - Anfänger-Themen 13
G taschrechner prob Java Basics - Anfänger-Themen 2
A Connection Prob Java Basics - Anfänger-Themen 3
F prob beim positionieren eines banners Java Basics - Anfänger-Themen 4
N Array-Prob Java Basics - Anfänger-Themen 6
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
K prob mit einer matrix.ha Java Basics - Anfänger-Themen 34
G Erklärungs Prob Java Basics - Anfänger-Themen 15
T Quersummen Prob. Java Basics - Anfänger-Themen 4
javafreak1986 Util.class Prob Java Basics - Anfänger-Themen 8
L RandomAccessFile - Prob Java Basics - Anfänger-Themen 4
G nen virus oder nen prob mit java Java Basics - Anfänger-Themen 3
M Prob bei JTextArea auf .setEditable(false) setzen Java Basics - Anfänger-Themen 2
G mal wieder Prob mit Jar-File Java Basics - Anfänger-Themen 16
T Prob. Interface und Paramter Java Basics - Anfänger-Themen 5
E 2 Prob.:"ArrayIndexOutOfBoundsException" & do- Java Basics - Anfänger-Themen 2
Z prob beim erstellen eines jar files mit eclipse Java Basics - Anfänger-Themen 4
G kleines Prob bei "net send" programm Java Basics - Anfänger-Themen 2
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
shiroX OOP Rekursive und Iterative Definition Java Basics - Anfänger-Themen 2
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
C Lineare Rekursion -> iterative Schleife Java Basics - Anfänger-Themen 3
T Iterative Berechnung einer Satellitenbahn Java Basics - Anfänger-Themen 20
A Rekursive Methode in Iterative umwandeln Java Basics - Anfänger-Themen 6
L iterative und rekursive Folge Java Basics - Anfänger-Themen 20
P iterative Berechnung Java Basics - Anfänger-Themen 9
R Differenz Iterative Java Basics - Anfänger-Themen 14
R Summe Iterative Java Basics - Anfänger-Themen 6
G rekursive u iterative Methode Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben