# Summe aller Natürlichen Zahlen - Methode Prüfen



## anarcho-anton (13. Nov 2010)

Hallo,
Ich bin Absoluter Programmier+Java Neuling.
Da an der Uni gerade die Infovorlesungen grottenschlecht sind fühle ich mich auf die Übungsblätter wirklich schlecht vorbereitet und muss wohl eher autodidaktisch an die ganze Sache herangehen.

Nun zu meinem Problem:
ich soll eine Methode schreiben, die die Summe aller Natürlicher Zahlen von 1 bis n berechnet.
Es ist auch eine Lösung wiefolgt angegeben:


```
public class Summe
static int calcSum(int n){
int sum = 0;
for(int i = 1; i <= n; i++) {
sum = sum + i;
}
return sum;
}
```

Die Methode leuchtet mir im Großen und ganzen schon ein, den Sinn von (return sum verstehe ich aber nicht.
Nun soll ich diese Methode mithilfe einer main-Methode testen.
Ausgegeben hätte ich gerne etwas durch System.out.println("n: " + n + ", sum: " + calcSum(n));
Das ich auch noch i-wo "public static void main(String[] args){}" (was ja nunmal die main-methode ist) einfügen muss habe ich jetzt auch begriffen. Wo ich die beiden Zeilen aber nun sinnvoll einfüge Ergibt sich mir nicht. Ausserdem verstehe ich nicht wie ich hier für den parameter n eine Zahl  einsetzen kann.
Als ich die Aufgabe zuerst selbst bearbeitet habe habe ich die mir Einleuchtende Methode 

```
public class C {
	public static void main(String [] args)
	{
		int n = 5;
		{
		long sum = 0;
		
		for (int i =1; i <= n; i++) {sum = sum + i;}
		
		System.out.println("n: " + n + ", sum: " + sum);
}
}}
```
verfasst, die sogar funktioniert und wo ich einfach den parameter n verändern kann.
Ist diese methode i-wie schlecht oder wieso basteln die bei der Lösung so komplizierte Dinge mit ein?
Vielen Dank für Antworten!

Bei der Abgabe am Mittwoch werd ich auf jeden Fall durchfallen aber jetzt brauch ich erstmal einen Anpack an das ganze Thema..


----------



## XHelp (13. Nov 2010)

```
public class Summe {
  static int calcSum(int n){
    int sum = 0;
    for(int i = 1; i <= n; i++) {
      sum = sum + i;
    }
    return sum;
  }
  public static void main(String[] args) {
    for (int i=1;i<20;i++) {
      System.out.println("n: " + i + ", sum: " + calcSum(i));
    }
  }
}
```

So ungefähr kannst du es machen.
Aber bevor du dich ins Programmieren stürzt, solltest du dir Grundlagen verschaffen. Es gibt genügend Anfänger-Bücher (z.B. Inselbuch).
P.S. Bei euch gibt es bestimmt auch Übungen und Tutorien zum Fach, wo man Fragen stellen kann (und wenn man etwas nicht versteht auch "muss")


----------



## aedu00 (13. Nov 2010)

Was verwirrt dich denn an der Musterlösung?

Mit return wird die Methode beendet und "sum" zurückgegeben. Die Methode spezifiziert, dass ein int zurückgegeben werden muss (sum ist ja ein int).  Deine Methode spezifiziert (mittels "void"), dass nicht zurückgeben wird.


----------



## Sagovana (13. Nov 2010)

Noch einfacher ist (im wahrsten Sinne des Wortes) nach Adam Riese

sum =(n/2)*(n+1);

Warum das so ist, überlasse ich Dir 

Ansonsten: Lies Steppan: Einstieg in Java6 . Da wird sehr gut erklärt, was wohin gehört und wie man Klassen in eigene Dateien packt.
EDIT: Ups obiges gilt nur, wenn n gerade ist, ansonsten muss man noch was ergänzen.


----------



## XHelp (13. Nov 2010)

Es ist zwar nach Carl Gauß und gilt auch für ungerade Zahlen, aber ist ok.


----------



## firewarrior (13. Nov 2010)

Hier nachzulesen.


----------



## Sagovana (13. Nov 2010)

XHelp hat gesagt.:


> Es ist zwar nach Carl Gauß und gilt auch für ungerade Zahlen, aber ist ok.



Mist, hatte Adam Riese in Erinnerung. Aber es gilt bei geraden Zahlen.

N=100
sum=100/2 * (100+1) =50 *101 = 5050 (Das war wohl die Originalaufgabe)

n ungerade: man reduziert auf n-1 (=gerade und addiert n dazu)

N=101
sum= 100/2*(100+1)+101=5151

EDIT: auch die Grundvariante funktioniert für gerade und ungerade Zahlen. ;-) Danke für den Link.


----------



## XHelp (13. Nov 2010)

Öhm. hast du es schon mal mit ungeraden versucht?

```
n = 100
100/2*(100+1) = 50*101 = 5050

n = 101
101/2*(101+1) = 50,5*102 = 5151
```
Das Produkt von 
	
	
	
	





```
n*(n+1)
```
 ist definitiv durch 2 ganzzahlig teilbar, da einer der Zahlen durch 2 teilbar ist.


----------



## Sagovana (13. Nov 2010)

XHelp hat gesagt.:


> Öhm. hast du es schon mal mit ungeraden versucht?
> 
> ```
> n = 100
> ...



Hatte ich auch so in Erinnerung gehabt, das die Formel immer gilt. Ich war nur unsicher geworden. ;-)


----------



## anarcho-anton (14. Nov 2010)

XHelp hat gesagt.:


> ```
> public class Summe {
> static int calcSum(int n){
> int sum = 0;
> ...



Da müssten mir doch alle summen von 1 bis 19 in dem fall ausgegeben werden?
ich hab so bisschen das gefühl das der java kram ziemlich viel basteln und probieren ist..
morgen wird sich erstmal ein Buch bestellt..   danke für die antworten!


----------



## Sagovana (14. Nov 2010)

anarcho-anton hat gesagt.:


> Da müssten mir doch alle summen von 1 bis 19 in dem fall ausgegeben werden?
> ich hab so bisschen das gefühl das der java kram ziemlich viel basteln und probieren ist..
> morgen wird sich erstmal ein Buch bestellt..   danke für die antworten!



Das mit dem Buch ist gerade für Einsteiger ein absolutes Muß.

ES ist am Anfang immer viel probieren. Das hat weniger was mit Java zu tun, als vielmehr mit dem Grundverständnis des Programmierens. Das dauert. 

Und: Es gibt immer viele Wege zum Ziel. Saubere, effiziente, schöne und dumme. Man lernt durch Erfahrung.

Beispiel:

Deine For-nextschleife ist schön und man sieht die Aufgabe darin direkt umgesetzt. Jedoch bei n=10000000 wirst Du sehr lange warten, weil 2x10000000 Additionen und 10000000 Schleifenoperationen durchgeführt werden.

sum =(N*(n+1))/2 liefert ein blitzschnelles Ergebnis, da nur 3 Rechenoperationen durchgeführt werden. Dafür ist es aber nur sehr schwer verständlich, was da eigentlich berechnet wird. Darum sind auch Kommentare so immens wichtig im Quelltext.

Forschleifen sind nur bei einer geringen Anzahl an Durchläufen wirklich sinnvoll. Insbesondere geschachtelte For-Schleifen können endlos dauern.

Das alles lernt man nur durch probieren und gute Bücher. ;-)


----------

