Summe der Vielfachen von zwei berechnen

paco89

Bekanntes Mitglied
hi, ich hab versucht folgende aufgabe (s. Bild) zu lösen und hab dazu folgenden code abgetippt:

Java:
public class problem1
{	
	public int Vielfache()
	
	{
	
	int ergebnis=0;
	int tmp1 = 0;
	int tmp2 = 0;
	for (int i =0 ; i<1000; i++)
	{
		int a = i * 3;
			if( a < 1000 )
			tmp1 += a;
	    
		int b = i * 5;
			if(b < 1000)
			tmp2 += b;
		
		ergebnis = tmp1 + tmp2;
		
	}
		return ergebnis;
	}
	
	public static void main (String [] args)
	{
		problem1 a = new problem1();
		
		System.out.println(a.Vielfache());
	}
	
	}


mein problem ist folgendes: in der aufgabe steht, dass die summe der vielfachen von 3 oder 5 insgesamt 23 ergibt. wenn ich jetzt in meinem code statt der oberen grenze 1000 zu testzwecken die zahl 10 einsetze, dann bekomme ich auch die summe 23 raus.
wenn ich aber die obere grenze 1000 wähle um die aufgabe zu lösen, bekomme ich als ergebnis 266333.

nun ja, die aufgabe habe ich von der seite Project Euler. da gibt es aufgaben die man halt lösen kann. bestimmt kennt ihr das auch. ich geb dann meine lösung ein und da sagt mir das system, dass sie falsch ist. aber wie kann das ergebnis für 10 stimmen und für die grenze 1000 nicht? ich muss ja eigtl. nur die grenzen ändern oder?

oder überseh ich da etwas?
 
F

Firephoenix

Gast
Die hat er beide drin, aber ich vermute mal die 1000 selbst fehlt noch als vielfaches von 5 oder?
 

jgh

Top Contributor
was soll diese Zeile bezwecken?
[java=13] int a = i * 3;
if( a < 1000 )
tmp1 += a;

int b = i * 5;
if(b < 1000)
tmp2 += b;[/code]

grundsätzlich brauchst du nur eine Variable, die das Ergebnis aufaddiert.
Für das Prüfen, ob eine Zahl ein Vielfaches von einer anderen ist, bietet sich der Modulo-Operator [c]%[/c] an. So brauchst du nur innerhalb deiner Schleife prüfen, ob es sich um ein Vielfaches von 3 oder 5 handelt und wenn ja, dann addierst du einfach dazu.

Java:
	public int Vielfache() {

		int ergebnis = 0;
		for (int i = 0; i < 1000; i++) {
			if (i % 3 == 0 | i % 5 == 0) {
				ergebnis += i;
			}

		}
		return ergebnis;
	}

PS:
METHODEN schreibt man klein, Klassen groß...
 
F

Firephoenix

Gast
Es sind tatsächlich nur die Zahlen unter 1.000 - eben selbst nochmal gemacht ;)
Was bei ihm vermutlich nicht funktiert hat:
Wenn eine Zahl ein Vielfaches von 3 und 5 ist (z.b. 15, 30 ...) wird sie 2 mal auf das ergebnis addiert,
die Version von jgh sollte in der Form das richtige Ergebnis produzieren - bis auf den Namen und ein oder mehr für short circuit evaluation sieht meine nämlich identisch aus.
Gruß
 

xehpuk

Top Contributor
Ich war mal so frei, die Lösung performanter zu machen und sie auf eine beliebige Anzahl an Faktoren zu abstrahieren:
Java:
public class Problem1 {
	public static void main(final String[] args) {
		final int i = 3, j = 5, m = 1000;
		final int sum = sum(m, i, j); // sum(m, i) + sum(m, j) - sum(m, lcm(i, j))
		System.out.println("Summe der Vielfache von " + i + " und " + j + " unter " + m + ": " + sum);
	}
	
	private static int sum(final int max, final int n) {
		int sum = 0;
		for (int i = n; i < max; i += n, sum += i);
		return sum;
	}
	
	public static int sum(final int max, final int n, final int... m) {
		int sum = sum(max, n);
		int lcm = n;
		for (final int i : m) {
			sum += sum(max, i);
			lcm = lcm(lcm, i);
		}
		sum -= sum(max, lcm);
		return sum;
	}
	
	private static int lcm(final int a, final int b) { // kgV
		return a * (b / gcd(a, b));
	}
	
	private static int gcd(final int a, final int b) { // ggT
		return b == 0 ? a : gcd(b, a % b);
	}
}
 

paco89

Bekanntes Mitglied
okay. danke, dass mit dem modulo wusste ich nicht (bin ein anfänger in sachen programmierung). vielen dank für den tipp. mich hat´s nur ein wenig überrascht, dass der code bei der grenze 10 das richtige ergebnis (23) geliefert hat und bei 1000 das falsche. na ja ;)
 

paco89

Bekanntes Mitglied
hallo, ich hab jetzt die aufgabe gelöst bekommen. und wollte mich an eine neue aufgabe heranwagen. und zwar habe ich jetzt eine neue aufgabe(siehe Bild). bevor ich das jdeoch tun kann, wollte ich sichergehen, ob ich die aufgabe auch richtig verstanden habe:

also dabei geht es doch um die fibonaaci-zahlen. da wird doch in dem letzten satz gesagt, dass die fibonacci-zahlen die 4 millionen nicht überschreitet. und danach steht dass ich irgendwas summieren muss. aber was? das habe ich nicht so ganz verstanden. wenn mir jmd. nur sagen, worum s da wirklich geht, dann kann ich versuchen das ganze zu programmieren.


vielen dank schon ma im voraus.
 

paco89

Bekanntes Mitglied
hi,

ich hab ma folgenden code geschrieben.

Java:
public class Fib
{
	public int fibo()
	{
		int f =0; 
		int g = 1;
		
		int grenze = 4000000;
		
		int ergebnis =0;
		
		for (int i=1; i<=grenze; i++)
		{
			f=f+g;
			g=f-g;
			
			if( f%2 == 0)
			ergebnis += f;
		}
		
		return ergebnis;
	}
	
	public static void main (String [] args)
	{
		Fib a = new Fib();
		System.out.println(a.fibo());
	}


aber da kommt als ergebnis was negatives raus. um zu überprüfen, ob die zahl gerade ist, hab ich den modulo-operator genommen. ich dachte mir, wenn etwas modulo 2 rest 0 ergibt, dann muss es sich ja um ne gerade zahl handeln. und die gerade zahlen sollten dann alle in der variablen ergebnis gesammelt werden. was habe ich falsch gemacht?
 

Bile Demon

Bekanntes Mitglied
Zum einen das Problem mit dem Integerüberlauf, zum anderen ist deine Berechnung falsch. Du hast da eine Zählschleife, die bis 4 Millionen zählt. Das ist nicht die Aufgabe.

Mit einer Hilfsvariable brauchst du dir schonmal keinen abbrechen:

Java:
while((f1+f2) <= 4000000){
   f2next = f1 + f2;
   f1 = f2;
   f2 = f2next;
}
 

Kababär

Top Contributor
My Friend Key: 54917099311901_a3eacca98b8696c10d5c434fb60efef8

Wenns jemand interessiert... hab mich gerade angemeldet. Ist sehr interessant die Seite :)

Das sind ja die ersten Aufgaben. Mal gespannt wie die anderen sein werden :)
 

paco89

Bekanntes Mitglied
ich wollte die aufgabe neu beginnen, aber dieses mal zu ende bringen. dazu habe ich meinen code umgeschrieben. das sieht jetzt so aus:

Java:
public class Fib
{
	private static long fibo(long grenze)
	{
		long f1 =0; 
		long f2 = 1;
		long ergebnis =0;
		long f2next;
		
		while ((f1+f2) <=grenze)
		{
			f2next=f1+f2;
			f1 = f2;
			f2 = f2next;
			
			if( f2next%2 == 0)
			ergebnis += f2next;
		}
		
		return ergebnis;
	}
	
	public static void main (String [] args)
	{
		System.out.println("Bitte geben Sie eine Zahl ein: ");
		long grenze = Integer.parseInt(System.console().readLine());
		
		System.out.println(fibo(grenze));
	}
}


es hat funktioniert.vielen dank...
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
Ich will nicht meckern, aber meiner Meinung nach ist es einfach nur Kacke, wenn hier Lösungen zu Aufgaben von Project Euler gepostet werden...
 

Neue Themen


Oben