Javakurs/Übungsaufgaben/Quersumme/Musterloesung
< Javakurs | Übungsaufgaben | Quersumme
Hinweis: Die Musterlösung kann von eurer Lösung abweichen, da es immer mehrere Varianten gibt ein Problem zu lösen. Im Zweifelsfall Fragt einen Tutor.
Aufgabe 1
public class Quersumme { /* * Berechnet die Quersumme einer uebergebenen Zahl */ public static int berechneQuersumme(int zahl) { int summe = 0; while (0 != zahl) { // addiere die letzte ziffer der uebergebenen zahl zur summe summe = summe + (zahl % 10); // entferne die letzte ziffer der uebergebenen zahl zahl = zahl / 10; } return summe; } /* * Gibt alle Zahlen innerhalb eines Bereiches [zahlVon, zahlBis] aus, die * eine bestimmte Quersumme haben */ public static void printZahlenFuerQS(int zahlVon, int zahlBis, int quersumme) { for (int i = zahlVon; i <= zahlBis; i++) { int qs = berechneQuersumme(i); if (qs == quersumme) { System.out.println(i); } } } /* * Gibt alle Zahlen innerhalb eines Bereiches [zahlVon, zahlBis] aus, die * ein Vielfaches einer bestimmten Quersumme sind. */ public static void printZahlenFuerVielfachesQS(int zahlVon, int zahlBis, int quersumme) { for (int i = zahlVon; i <= zahlBis; i++) { int qs = berechneQuersumme(i); if (0 != qs && 0 == (qs % quersumme)) { System.out.println(i); } } } /* * Berechnet wie haeufig die Quersummen innerhalb eines bestimmten Bereiches * [zahlVon, zahlBis] vorkommen und gibt diese als Array der Form * array[quersumme] = Anzahl zurueck */ public static int[] berechneHaeufigkeiten(int zahlVon, int zahlBis) { int anzahlQuersummen = 0; int temp = zahlBis; while (0 != temp) { anzahlQuersummen = anzahlQuersummen + 1; temp = temp / 10; } int[] quersummen = new int[anzahlQuersummen * 9]; for (int i = zahlVon; i <= zahlBis; i++) { int qs = berechneQuersumme(i); quersummen[qs] = quersummen[qs] + 1; } return quersummen; } /* * Berechnet den hoechsten Wert eines uebergebenen Arrays */ public static int berechneArrayMaximum(int[] quersummen) { int max = 0; for (int i = 0; i < quersummen.length; i++) { if (quersummen[i] >= max) { max = quersummen[i]; } } return max; } /* * Gibt die am häufigsten vorkommende Quersumme innerhalb eines bestimmten * Bereichs [zahlVon, zahlBis] auf der Konsole aus */ public static void printMaxQuersumme(int zahlVon, int zahlBis) { int[] quersummen = berechneHaeufigkeiten(zahlVon, zahlBis); System.out.println(berechneArrayMaximum(quersummen)); } /* * Gibt die iterierte Quersumme einer uebergebenen Zahl auf der Konsole aus */ public static void printIterierteQuersumme(int zahl) { int iterierteQuersumme = zahl; while (0 != zahl) { iterierteQuersumme = berechneQuersumme(iterierteQuersumme); zahl = zahl / 10; } System.out.println(iterierteQuersumme); } /* * Berechnet das Querprodukt einer uebergebenen Zahl */ public static int berechneQuerprodukt(int zahl) { int produkt = 1; while (0 != zahl) { // multipliziere die letzte ziffer der uebergebenen zahl zum produkt produkt = produkt * (zahl % 10); // entferne die letzte ziffer der uebergebenen zahl zahl = zahl / 10; } return produkt; } /* * Gibt die Zahlen innerhalb eines Bereiches [zahlVon, zahlBis] auf der * Konsole aus, für die gilt Zahl = Quersumme + Querprodukt */ public static void printQuersummeQuerprodukt(int zahlVon, int zahlBis) { for (int i = zahlVon; i <= zahlBis; i++) { int qs = berechneQuersumme(i); int qp = berechneQuerprodukt(i); if (i == (qs + qp)) { System.out.println(i); } } } public static void main(String[] args) { // Gib alle Zahlen von 0-1000 aus, welche die Quersumme 15 haben printZahlenFuerQS(0, 1000, 15); // Gib alle Zahlen von 0-1000 aus, deren Quersumme ein Vielfaches von 17 ist printZahlenFuerVielfachesQS(0, 1000, 7); // Gib die am haeufigsten vorkommende Quersumme von 0-1000 aus printMaxQuersumme(0, 1000); // Gib die iterierte Quersumme von 47 aus printIterierteQuersumme(47); // Gib alle Zahlen aus für die gilt Zahl = Quersumme + Querprodukt printQuersummeQuerprodukt(0, 1000); } }
- Spalte die einzelnen Ziffern mittels Division und Modulo-Operation ab und addiere sie, um die Quersumme zu bestimmen.
Siehe Methode berechneQuersumme
- Gib alle Zahlen von 0 - 1000 aus, welche die Quersumme 15 haben.
69
78
87
96
159
168
177
186
195
249
258
267
276
285
294
339
348
357
366
375
384
393
429
438
447
456
465
474
483
492
519
528
537
546
555
564
573
582
591
609
618
627
636
645
654
663
672
681
690
708
717
726
735
744
753
762
771
780
807
816
825
834
843
852
861
870
906
915
924
933
942
951
960
- Gib alle Zahlen von 0 - 1000 aus, deren Quersumme ein Vielfaches von 7 ist.
7
16
25
34
43
52
59
61
68
70
77
86
95
106
115
124
133
142
149
151
158
160
167
176
185
194
205
214
223
232
239
241
248
250
257
266
275
284
293
304
313
322
329
331
338
340
347
356
365
374
383
392
399
403
412
419
421
428
430
437
446
455
464
473
482
489
491
498
502
509
511
518
520
527
536
545
554
563
572
579
581
588
590
597
601
608
610
617
626
635
644
653
662
669
671
678
680
687
696
700
707
716
725
734
743
752
759
761
768
770
777
786
795
806
815
824
833
842
849
851
858
860
867
876
885
894
905
914
923
932
939
941
948
950
957
966
975
984
993
- Welche Quersumme der Zahlen von 0 - 1000 kommt am häufigsten vor? (Tipp: Überlegt Euch, wie viel verschiedene Quersummen vorkommen können, erstellt ein Array dieser Größe und speichert dort die Anzahl der Vorkomnisse)
75
- Die iterierte Quersumme wird auch Ziffernwurzel genannt (Abk. zw) Beispiel:
47 --> 4 + 7 = 11 --> 1 + 1 = 2, also zw(47)=2
Schreibt ein Programm, welches die Ziffernwurzel für eine beliebige Zahl bestimmt.
Siehe Methode printIterierteQuersumme
- Das Querprodukt ist wie folgt definiert: 68 = 6 * 8 = 48. Es gibt Zahlen, bei denen die Summe aus Quersumme und Querprodukt wieder die Zahl selbst ergibt Beispiel: 79 = 7 + 9 + 7*9 = 79. Gibt es weitere Zahlen zwischen 0 und 1000 mit dieser Eigenschaft? Wenn ja, welche ?
19
29
39
49
59
69
79
89
99
Aufgabe 2
public class BoeseSieben { /* * Bestimmt ob eine uebergebene Zahl durch eine zweite uebergebene Zahl * teilbar ist */ public static boolean istTeilbar(int zahl, int durch) { if (durch == 0) { return false; } return (zahl % durch == 0); } /* * Bestimmt ob eine uebergebene Zahl eine zweite uebergebene Zahl als Ziffer * enthält */ public static boolean enthaelt(int zahl, int ziffer) { while (0 != zahl) { if (ziffer == (zahl % 10)) { return true; } zahl = zahl / 10; } return false; } public static void main(String[] args) { int zahl = 14; if (enthaelt(zahl, 7) || istTeilbar(zahl, 7)) { System.out.println("Die nächste Zahl muss übersprungen werden"); } else { System.out.println("Die nächste Zahl darf nicht übersprungen werden"); } } }
Kommentare
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)