# Summe der Vielfachen von zwei berechnen



## paco89 (15. Feb 2012)

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


```
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?


----------



## JCODA (15. Feb 2012)

*hust* Was passiert mit den Vielfachen von 3 UND 5 ?


----------



## Firephoenix (15. Feb 2012)

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


----------



## JCODA (15. Feb 2012)

Firephoenix hat gesagt.:


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



Sorry, aber nö: 


			
				ProjektEuler hat gesagt.:
			
		

> If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
> 
> Find the sum of all the multiples of 3 or 5 below 1000.


----------



## jgh (15. Feb 2012)

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.


```
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ß...


----------



## Firephoenix (15. Feb 2012)

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 (15. Feb 2012)

Ich war mal so frei, die Lösung performanter zu machen und sie auf eine beliebige Anzahl an Faktoren zu abstrahieren:

```
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 (15. Feb 2012)

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 (15. Feb 2012)

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.


----------



## Bile Demon (15. Feb 2012)

paco89 hat gesagt.:


> und danach steht dass ich irgendwas summieren muss. aber was?



Du sollst die Fibonacci-Folge fortsetzen bis maximal 4 Millionen. Anschließend sollst du davon nur die geraden Zahlen aufsummieren, also 2 + 8 + 34 + ...

So hab ich die Aufgabe verstanden.


----------



## paco89 (15. Feb 2012)

okay, dann mache ich mich ma an die aufgabe...vielen dank


----------



## paco89 (16. Feb 2012)

hi,

ich hab ma folgenden code geschrieben. 


```
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?


----------



## timbeau (16. Feb 2012)

Probier mal statt "int" "long" und einfach mal debuggen oder sysouts machen.


----------



## Bile Demon (16. Feb 2012)

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:


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


----------



## paco89 (17. Feb 2012)

okay, danke für die hilfe. ich werds ma versuchen.


----------



## Kababär (19. Feb 2012)

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 (29. Mrz 2012)

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


```
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...


----------



## faetzminator (29. Mrz 2012)

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


----------

