# vielfache, fakultät und primzahltest



## Ga1st (27. Mrz 2011)

Hallo,
ich verzweifle gerade bei meiner informatik hausaufgabe...
Und zwar ist unser thema gerade schleifen und wir sollen mit den schleifen 7 Nummern lösen bei 3 komme ich nicht weiter:

4. Vielfaches
Erstelle ein Programm Vielfache. Dabei sollen die ersten 20 Vielfachen einer Zahl ausgegeben
werden, die der Benutzer eingeben kann.
5. Aufgabe
Die Fakultät einer natürlichen Zahl n (geschrieben n!) ist definiert als das Produkt aller natürlichen
Zahlen, die kleiner oder gleich n sind, also z.B.: 5! = 5*4*3*2*1
Schreibe ein Programm Fakultaet, das die Fakultät einer eingegebenen Zahl ausgibt. Realisiere es
einmal mit der for-schleife, einmal mit der while-Schleife.
6. Aufgabe
Von einer natürlichen Zahl n soll festgestellt werden, ob sie eine Primzahl ist. Ein einfaches –
wenngleich ineffiktives – Verfahren ist es, die Zahl durch die Zahlen durch 2, 3, ... n zu teilen
und zu überprüfen, ob dabei der Rest einmal Null ist. Entwickle ein Programm Primzahltest.

Könnt ihr mir bitte helfen? Ich habe es versucht doch ich schaffe es einfach nicht!


----------



## XHelp (27. Mrz 2011)

Welche Ansätze hast du denn? Wenn in 1-3 auch Schleifen vorgekommen sind, dann wirst du doch Ideen dazu haben.


----------



## feiste (27. Mrz 2011)

also 4. hätt ich jetzt so gemacht:


```
for(i=1;i<=20;i=i+1)
        {
            b = a * i;
            System.out.println(i + ": " +b);
           
        }
```


----------



## feiste (27. Mrz 2011)

5.  hätt ich so gemacht:


```
long b = 1;
    public fakultaet(int c)
    {
        for(int i=1;i<=c;i++)
        {
          
          b = b * i;
           
        }
       System.out.println("Die Fakultät von " + c + " ist " + b);
            
        
    }
```


----------



## Ga1st (27. Mrz 2011)

danke feiste und zu xhelp hier sind meine lösungsansätze:

Vielfaches:
public class Vielfaches {

  public static void main(String[] args) {
    int x = 0, y = 0;

    System.out.println("Geben Sie ihre Zahl ein");
    x = Input.readInt ();
    do {
      y = x*x;
    } while (y == *20);
    System.out.println("Ihr Ergebnis ist :"+ x );

  }
}


Fakultät:

public class Fakultät {

    public static void main(String[] args) {

     int x=0,y=1;

     System.out.println("Geben Sie eine Zahl ein, von der Sie die Fakultät berechnen wollen!");
     x = Input.readInt ();


      for (int zahl=1; zahl == x; zahl++) {
      y = y * zahl;
      }
     System.out.println("Die Fakultaet von " + x + " ist " + y);
    }
    }

und Primzahl test hab ich überhaupt keine ahnung, wirklich ich weiß garnicht mal wie ich da anfangen soll


----------



## Ga1st (27. Mrz 2011)

zu feiste, was bedeutet "long"? das hatten wir noch nicht, kannst du bitte eins ohne long machen? wir hatten bis jetzt nur int und double gehabt und schleifen das wars


----------



## feiste (27. Mrz 2011)

Ga1st hat gesagt.:


> zu feiste, was bedeutet "long"? das hatten wir noch nicht, kannst du bitte eins ohne long machen? wir hatten bis jetzt nur int und double gehabt und schleifen das wars



"long" ist das gleiche wie "int"
nur dass die Zahl mit long  viel größer sein kann wie int.
Also ersetz long einfach durch int.


----------



## feiste (27. Mrz 2011)

6. :
mit Math.sqrt(c) zieht man die Wurzel aus der Zahl c.
Das mach ich weil ich ja die Zahlen die über Wurzel-c nicht prüfen muss.


```
boolean value = true;
   
   
   public primzahl(int c)
    {  double b = Math.sqrt(c);
        for(int i=2;i<=b;i++)
        {
          if( (c  % i) == 0 )
          { value = false; }
           
        }
       
            if(value == false ^ c == 2)
           { System.out.println("Die Zahl " + c + " ist keine Primzahl!");}
               else
               {System.out.println("Die Zahl " + c + " ist eine Primzahl!");}
        }
```


----------



## Ga1st (27. Mrz 2011)

dankeschön hast mir sehr geholfen!! es gibt noch eine zusatzaufgabe die ich gerne machen würde:
Zusatzaufgabe: Simulation einer Population
In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen
vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und
aktuellem Bestand A. Wie entwickelt sich die Population?
a) ohne äußere Einwirkungen
b) wenn am Ende jedes Jahres 20% des Bestandes entnommen werden?
Schreibe dazu ein Simulationsprogramm.
Reimherr

bei
a) müsste doch ung. so aussehen das man a mit 50 karpfen bestimmt und h mit 350.
   dann zieht man die differenz zwischen h und a, also a = h / a.
   Dann muss man a = a*1.06 rechnen. Dies alles in eine schleifen setzen bis a >= 350 ist. Da würde ich noch gerne eine anzahl einbauen, die bestimmt wieviele jahre man braucht bis der teich gefüllt ist. Wie geht das?

b) genau das gleiche bei a nur nach a = a*1.06, muss man a = a*0.80 rechnen. die bedingung wäre wieder bis a >= 350 ist oder a<0 ist, denn ich habe das gefühl, das viel mehr gefischt wird, als das die fische sich wieder regenerieren können. Ist mein gedankenablauf bis jetzt ok?? ich werde mich jetzt hinsetzen und das programm schreiben. Wenn ich fertig bin werde ichs hier posten


----------



## despikyxd (27. Mrz 2011)

erstmal ... bitte java-code-tags nutzen ...
zweitens : Fakult*ä*t ist nun wirklich kein name für eine klasse ...
man sollte sowieso auf sonderzeichen in datei- und verzeichnisnamen verzichten um plattform-inkompatibilitäten zu vermeiden
drittens : was fakultät angeht ... die lösung dazu steht bei wikipedia .. einmal als iterator und einmal als recursive ... Rekursion ? Wikipedia bei programmierbeispiel II ... das untere ... ist zwar pseudo-code aber lässt sich leicht nach java übersetzen

jetzt zu deinen ansätzen ...

dein erstes beispiel schlägt schon mal sehr heftige fehler alleine in der reinen mathematik und logik ...
du liest eine zahl ein ... soweit ok
du betritts eine schleife mit DO ... > ich hoffe du kennst den unterschied zwischen while und do-while ...
bei do-while wird die schleife IMMER mindestens EIN MAL ausgeführt ... egal ob die bedingung true oder false liefert
dann speicherst du das ergebnis von x MAL x *also x²* in y ... das hat aber in keinster weise was mit vielfachem zu tun ...
sicher ... if(1 <= input <= 20) ... also input zwischen 1 und 20 *beide mit eingeschlossen* ... dann wird irgendwann mal auch x² dabei sein ... aber ansonsten hat beides nichts weiter mit ein ander zu tun ...
dann auch noch dieses komische while-konstrukt ... also ohne es auszuprobieren ... aber das dürfte zu einem compiler-error führen ... und selbst wenn es irgendwie compiled werden sollte ... dann ist es definitiv NICHT die bedingung die da rein gehört

du musst dir die aufgabe erstmal durch den kopf gehen lassen ...
du sollst ein programm schreiben das die 20 ersten vielfache der eingegeben zahl ausgibt ...
brauchst du erstmal 3 variable : 1) der input 2) den zähler 3) das ergebnis je schleifen durchgang ...
hiervon können wir den dritten gleich wieder streichen da wir das ergebnis ja sofort ausgeben ...
haben wir als ROH-bau schonmal das hier

```
public class Vielfaches
{
	public static void main(String[] args) { new Vielfaches(); }
	public Vielfaches()
	{
		int input=0, zaehler=1;
	}
}
```
nun kommen wir zur schleife
du willst erreichen das bei jedem durchgang das produkt aus der gleichung "input x zaehler" auf der console ausgegeben wird bis der zähler 20 erreicht hat
gleichzeitig muss aber auch der zähler erhöt werden
daraus folgen also schonmal die formel und die bedingung
ob wir das nun in einer FOR- oder eine WHILE- schleife machen ist egal ... man könnte sich bei der FOR lediglich die expliziete "zaehler" variable sparen ...
aber machen wir es ruhig mal mit WHILE *FOR werd ich drunter schreiben*

```
public class Vielfaches
{
	public static void main(String[] args) { new Vielfaches(); }
	public Vielfaches()
	{
		int input=0, zaehler=1;
		while(zaehler<=20)
		{
			System.out.println(input*zaehler);
			zaehler++;
		}
	}
}
```
was jetzt noch fehlt ist das lesen des inputs ...
wir bedienen uns hier einfach mal des java.util.Scanner ... er wird oft in anfänger-tut's genutzt und spart das lästige selbst-schreiben ...
komplett sieht dann dein programm also so aus

```
import java.util.Scanner;
public class Vielfaches
{
	public static void main(String[] args) { new Vielfaches(); }
	public Vielfaches()
	{
		int input=0, zaehler=1;
		System.out.print("Bitte Zahl eingeben : ");
		Scanner scanner=new Scanner(System.in);
		try { input=scanner.nextInt(); }
		catch(Exception e) { e.printStackTrace(); System.exit(1); }
		while(zaehler<=20)
		{
			System.out.println(input*zaehler);
			zaehler++;
		}
	}
}
```

und das ganze mit FOR sieht so aus


```
import java.util.Scanner;
public class Vielfaches
{
	public static void main(String[] args) { new Vielfaches(); }
	public Vielfaches()
	{
		int input=0; //zaehler kann hier entfallen da dieser im kopf der FOR-schleife erzeugt wird
		System.out.print("Bitte Zahl eingeben : ");
		Scanner scanner=new Scanner(System.in);
		try { input=scanner.nextInt(); }
		catch(Exception e) { e.printStackTrace(); System.exit(1); }
		for(int i=1; i<=20; i++)
		{
			System.out.println(input*i);
		}
	}
}
```

zu 5. hab ich bereits gesagt : steht bei wikipedia *das ist die WHILE-variante*
als FOR sähe das in etwa so aus

```
public int fakultaet(int input)
{
	int fakultaet=1;
	for(int faktor=2; faktor<=input; faktor++)
	{
		fakultaet*=faktor;
	}
	return fakultaet;
}
```

außerdem hast du einen schweren fehler im kopf der FOR
for (int zahl=1; zahl == x; zahl++) ... wird entweder garnicht ausgeführt ... nämlich dann wenn du alles andere als 1 eingibst ... oder nur einmal ... nämlich wenn du 1 eingibst ...
hier müsstest du sowas wie <= verwenden ...

und nun zu 6.
du sollst also ermitteln ob die eingegebene zahl eine primzahl ist ...
du hast sogar einen lösungsansatz vorgegeben : testen ob n/2, 3, 4, n-1 einen rest aufweist ... wenn rest 0 ist dann false returnen
und bleiben wir doch mal zum testen bei dieser langsamen methode ...
bauen wir es hier mal wieder als FOR *am while wäre nicht viel anders*

```
public boolean primTest(int input)
{
	for(int i=2; i<input; i++)
	{
		if((input%i)==0)
			return false;
	}
	return true;
}
```

das beispiel von feiste das man die zahlen über sqrt(input) nicht prüfen muss is zwar mathematisch richtig ... aber wir bleiben hier mal aufm boden ...

zusatz
also a = h / a

totaler blödsinn ... h / a heißt h GETEILT DURCH a ...
differenz ist MINUS ...
also h-a ...



*wem das immer noch zu wenig is bitte meckern*


----------



## Ga1st (27. Mrz 2011)

Danke!
Jetzt zur zusatzaufgabe, ja du hast recht differenz heißt minus^^ habe es verwechselt
so sieht mein java programm aus für die a):
[Java]public class Fischteich {

  public static void main(String[] args) {
    double a= 50, h = 350, i = 0;

    System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");

    do {
      a = h-a;
      a = a*1.06;
      i++;
    }while ( a < 350 );

    System.out.println("Es dauert " +i+ " Jahre bis der Teich voll ist");

  }
}[/code]


----------



## Ga1st (27. Mrz 2011)

Ist das richtig? bei mir kommt raus, dass man 5 jahre braucht bis der teich voll ist


----------



## despikyxd (27. Mrz 2011)

also erstens : gewöhn dir bitte die sofortige nutzung des DO-while ab ... das macht nur in sehr wenigen fällen sinn wenn man sichergehen will das der schleifen-inhalt mindestens einmal ausgeführt wird ... wenn das nicht 100% notwendig ist reicht ein normales while völlig aus ...

und zweitens : ich versteh nich viel von population ... aber da ja gefragt wird wie sich die population entwickelt und nicht wie lange es dauert bis der teich voll ist denke ich mal das bei jedem schleifen-durchlauf die aktuelle population ausgegeben werden soll ...

und zu b : grob übern daumen gepeilt ist der ansatz soweit erstmal richtig ... nur ist darauf zu achten ob man erst 1.06 und dann 0.8 oder umgekehrt rechnet ... probier am besten mal beides aus und werte die ergebnisse aus ob sie realistisch erscheinen *also der bestand sich irgendwie hält oder anwächst* oder eben nicht so der wahrheit entsprechen *der teich innerhalb kurzer zeit leer ist*


----------



## Ga1st (27. Mrz 2011)

Ich habs neu gemacht, aber jetzt sehen die Ergebnisse seeeehr unrealistisch aus:


```
public class Fischteich {

  public static void main(String[] args) {
    double a= 50, h = 350, i = 0;
    
    System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");

    while ( a < 350 ) {
      a = h-a;
      a = a*1.06;
      i ++;
      System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
    }

  }
}
```

Als Ergebniss steht: 
1. 318
2. 33.92
3. 335.0448
4. 15.85251999
5. 354.196

Schon alleine das es keine 33.92 fische geben kann ist merkwürdig. Kann man die Zahlen runden lassen?


----------



## XHelp (27. Mrz 2011)

Nein, der Ansatz stimmt auf den ersten Blick, du veränderst ja die aktuelle Population einfach so. Es sollte wohl eher sowas wie:

```
a += (h-a)*0.06;
```
in der Schleife stehen


----------



## despikyxd (27. Mrz 2011)

runden ? klar ... aber wozu ... einfach INT anstatt DOUBLE und bei der rechnung einfach a=(int)a*1.06 ... rest macht java selbst ...

und was das unrealistisch angeht : ich glaub du rechnest einfach mit der falschen zahl weiter da du beim zweiten durchgang plötzlich a=318 hast ... und dann im nächsten schritt a=350-318 ... ich glaub du hast hier einfach nur die falsche variable bzw eine zu wenig genommen


----------



## Ga1st (27. Mrz 2011)

was bedeutet denn += ? und das mit dem int funktioniert!

und wenn ich deine formel nehme xhelp, sieht mein ergebniss sehr viel realistischer aus danke! ich mache jetzt mal die b


----------



## XHelp (27. Mrz 2011)

> was bedeutet denn += ?


Das ist nur eine Kurzform für:

```
a = a + (h-a)*0.06;
```


----------



## Ga1st (27. Mrz 2011)

es funktioniert danke für eure hilfe!!!
nur noch eine schönheitskorrektur, und zwar wenn ich double durch int ersetze kürzt java eine bestimme zahl immer ab ( ich glaube es war 334) und deshalb läuft mein programm bis ins unendliche.
wie könnte ich es dennoch schaffen das nur gerade zahlen rauskommen?


```
public class Fischteich {

  public static void main(String[] args) {
    double a= 50, h = 350, i = 0;

    System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");

    while ( a < 350 ) {
      a += (h-a)*0.06;
      a += 0.20;
      i ++;
      System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
    }

  }
}
```
Das ist die b


----------



## XHelp (27. Mrz 2011)

Du kannst dir die Population des Vorjahres merken und abbrechen, wenn die sich nicht mehr ändert.

B ist falsch, was soll denn 
	
	
	
	





```
a+=0.20
```
 sein?


----------



## Ga1st (27. Mrz 2011)

ich meinte a*=0.20

aber da hab ich mich zufrüh gefreut, das programm bleibt bei 5.1724 hängen und wiederholt sich die ganze zeit :/


----------



## feiste (27. Mrz 2011)

warum nur gerade Zahlen ?
meinst du ganze Zahlen ?

double zahlen aufrunden kann man damit:
Math.ceil()


----------



## XHelp (27. Mrz 2011)

1. ist es immer noch falsch, da "20% entnommen werden" und nicht "20% bleiben"
2. 5.1724 fische... merkst du was? Warum benutzt du bei Teilaufgabe A integer und bei B plötzlich wieder double?


----------



## Ga1st (27. Mrz 2011)

jetzt habe ich a*=0.80 eingegeben, aber er bleibt bei 67.7 hängen.
und ich hab bei meiner a) double und nicht int benutzt, habe nur gesagt das man mit int gerade zahlen herausbekommen würde, die sich aber ab einer bestimmten zahl nur noch abrunden.
und das Math.ceil() funktioniert nicht bei mir kommt das:
ceil(double) in java.lang.Math cannot be applied to ()
    Math.ceil();
        ^
1 error



```
public static void main(String[] args) {
    double a= 50, h = 350, i = 0;

    System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");
    Math.ceil();
    while ( a < 350 ) {
      a += (h-a)*0.06;
      a *= 0.80;
      i ++;
      System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
    }

  }
}
```


----------



## Ga1st (27. Mrz 2011)

das ^ ist unter dem "."


----------



## feiste (27. Mrz 2011)

so könnte man es auch machen

das ganze nennt man exponentielles Wachstum

y = A * x^1.06 (bzw. 0.8)  (das ^ bedeutet hoch, also potenz)

x: zeit (in jahre)
y: anzahl karpfen
A: Startwert (50 Karpfen)

wenn man jetzt wissen will wieviele karpfen nach 1 Jahr ( bzw. 2,3,4,5 .. Jahre) im teich sind 
einfach in  x  die anzahl der jahre einsetzten.
und dann einfach while schleife ( <=350 )

wenn man jetzt genau wissen will wielange es dauert bis genau 350 karpfen drin sind (mit nachkomma stellen) muss man auf  x  auflösen  und für y 350 einsetzten. (logarithmus)


----------



## feiste (27. Mrz 2011)

> und das Math.ceil() funktioniert nicht bei mir kommt das:
> ceil(double) in java.lang.Math cannot be applied to ()
> Math.ceil();



du musst double zahl in die klammer schreiben !
z.B
Math.cheil( doube a )  

wenn a jetzt  3.5 wäre
wird dir 4 ausgegeben


----------



## XHelp (27. Mrz 2011)

Du kannst ja nicht einfach mal irgendwohin 
	
	
	
	





```
Math.ceil();
```
 reinschreiben und hoffen, dass es schon richtig sei:
Galileo Computing :: Java ist auch eine Insel – 12.3 Die Eigenschaften der Klasse Math


----------



## feiste (27. Mrz 2011)

feiste hat gesagt.:


> so könnte man es auch machen
> 
> das ganze nennt man exponentielles Wachstum
> 
> ...




wenn du es so machst wie hier beschrieben
hier wird gezeigt wie man Logarithmus bei java verwendet 

Logarithmus


----------



## Ga1st (27. Mrz 2011)

Ok, die zusatzaufgabe hab ich jetzt. Jetzt wollte ich nochmal kurz die fakultät machen, doch ich bleibe hängen :/


```
public class Vielfaches {

  public static void main(String[] args) {
    int x = 0, y = 0;

    System.out.println("Geben Sie ihre Zahl ein");
    x = Input.readInt ();

    while (x != 1) {
      y = x*(x-1);
      x--;
      System.out.println("Ihr Ergebnis ist: "+y);

    }


  }
}
```
anstatt das die zahl höher wird, z.b bei 5 = 20, 60, 120
wird sie niedriger 20,12,6,2

ich hab es jetzt anders gemacht als beim vorherigen post es mir gezeigt wurde, weil ich das return nicht verstanden habe


----------



## despikyxd (28. Mrz 2011)

das return ist lediglich das zurückgeben des ergebnisses wenn du es als funktion aufrufst ...

dierekt inner main

FOR

```
public static void main(String[] args)
{
	int fakultaet=1;
	int input=(new Scanner(System.in)).nextInt();
	for(int faktor=2; faktor<=input; faktor++)
	{
		fakultaet*=faktor;
	}
	System.out.println(fakultaet);
}
```

WHILE *nach wikipedia-pseudo-code*

```
public static void main(String[] args)
{
	int fakultaet=1;
	int faktor=2;
	int input=(new Scanner(System.in)).nextInt();
	while(faktor<=input)
	{
		fakultaet*=faktor;
		faktor++;
	}
	System.out.println(fakultaet);
}
```

das mit dem immer kleiner werdenen faktor ist rekursiv und so wie du es wolltest nicht umsetzbar
darüber hinaus hast du wieder den selben fehler gemacht wie letzte mal : du speicherst das ergebnis einer runde in y und rechnest damit aber in der nächsten runde nicht weiter sondern speichers nur immer wieder ein neues ergebnis in y ...
vllt solltest du nächste mal deine klassen mit papier und bleistift versuchen durchzurechnen ... vllt merkst du dann beim dritten versuch ob du den selben fehler wieder gemacht hast oder etwas anderes nicht stimmt


----------



## Andi_CH (28. Mrz 2011)

Verblüffend was es in diesem Forum alles gibt ;-)


----------



## Crian (28. Mrz 2011)

Ga1st hat gesagt.:


> Zusatzaufgabe: Simulation einer Population
> In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen
> vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und
> aktuellem Bestand A. Wie entwickelt sich die Population?
> ...



Was jetzt: Karpfen oder Forellen?

Rein logisch lassen sich die Fragen so nicht beantworten. Wenn man davon ausgeht, dass die gleichen Fische gemeint sind, hingegen schon.


----------



## despikyxd (28. Mrz 2011)

@Andi ... wollte auch erst den link ins HA-forum posten ... habs aber nich gefunden weil ichs überlesen hatte ^^


----------



## Andi_CH (28. Mrz 2011)

Sogar der Fehler mit Karpfen und Forellen ist identisch :-(

An andere Stelle wird über das Niveau der Fragen philosophiert - na ja, das gehört eben auch dazu und man muss nicht einam die Forumssuche hier benutzen - google liefert mit dem Suchbegriff "java karpfenteich" den direkten Link zum HA-Thread :-(


----------



## despikyxd (28. Mrz 2011)

OUCH ... das is schon heftig wenn selbst google dierekt den HA-thread listet ... und das bestimmt als einen der ersten einträge ...
tja ... aber da sieht man wie tief das niveau hier liegt ... noch nich mal mehr die mühe machen selbst zu googlen ... schlimm schlimm


----------

