Reiskörner

Status
Nicht offen für weitere Antworten.

Starmagic

Mitglied
Einen schönen guten Abend

Ich habe ein kleines problem:

Aufgabe:

Ein indischer Weise sollte einmal von seinem König für einen erbrachten Diesnt belohnt werden. Der Weise wünschte sich für die kommenden 64 Tage Reisportionen . Dabei sollte am ersten Tag ein Reiskorn auf das Feld eines Schachbretts gelegt werden, und dann jeweils auf das nächste feld die doppelte menge des vorherigen.

Es soll halt herausgefunden wieviele tage es dauert, bis der Weise eine bestimmte(einzugebende) Anzahl an Reiskörnern erhalten hat.

Ausgabedaten: Tage, Anzahl der Reiskörner

ich bin noch ein Anfänger in Java also bitte nicht lachen wenn ich ganz was falsches programmiert habe^^.

Code:
import java.io.*;
public class testing
{
	public static void main(String argv[]) throws IOException
	{
		//Variablendeklaration
		int tage, reiskorn;
		String str;
		
		//Initialisierung
		tag=1;
		reiskorn=1;
		
		BufferedReader eingabe= new BufferedReader (new InputStreamReader(System.in));
		
		//Eingabe der Reiskörner
		System.out.print("Bitte geben Sie die Anzahl der Reiskörner an:");
		
		//lesen des Eingabeobjektes
		str=eingabe.readLine();
		
		//Umwandeln des datentyps string in Integer
		
		reiskorn=Integer.parseInt(str);
		
		
		
		//Berechnung
		do  while (reiskorn !=reiskorn)
		{tage=tage+1;
		reiskorn=reiskorn*2;
		}
		
		System.out.print("Reiskorn:"+reiskorn);
		System.out.print("Tage:"+tage);
		
		}
		}

Bitte helfen^^ Danke Vielmals

mfg starmagic

Edit Illuvatar: Bitte Codetags verwenden :!:
 

The_S

Top Contributor
Und was geht/geht nicht? Benutze das nächste mal bitte Code-Tags, dass macht deinen Code leserlicher.
 
S

SlaterB

Gast
die korrekte Syntax einer while- oder do while-Schleife könntest du ja in einem Lehrbuch nachlesen

ansonsten macht while (reiskorn != reiskorn) wenig Sinn,
du brauchst 2 unterschiedliche Variablen, einmal und den täglichen Wert zu vergrößern,
und zum anderen um den gesuchten Wert zu merken,

das kann man schlecht beides in einem int-Wert speichern ;)


!= ist als Vergleich sowieso nicht so gut,
wenn5 gesucht ist und die Reihe 1,2,4,8,16, .. lautet dann wird ja in alle Ewigkeit gesucht und doch nie gefunden,
< ist besser

Code:
	public static void main(String argv[]) throws IOException {
		//Variablendeklaration
		int tage, reiskorn, bisher;
		String str;

		//Initialisierung
		tage = 1;
		reiskorn = 1;
		bisher = 1;

		BufferedReader eingabe =
			new BufferedReader(new InputStreamReader(System.in));

		//Eingabe der Reiskörner
		System.out.print("Bitte geben Sie die Anzahl der Reiskörner an: ");

		//lesen des Eingabeobjektes
		str = eingabe.readLine();

		//Umwandeln des datentyps string in Integer

		reiskorn = Integer.parseInt(str);

		//Berechnung
		while (bisher < reiskorn) {
			tage = tage + 1;
			bisher = bisher * 2;
		} 
		
		System.out.println();
		System.out.println("Reiskorn:" + reiskorn);
		System.out.println("Tage:" + tage);

	}
 

lin

Top Contributor
vllt. so was in der Art
Code:
package jforum;

import java.io.*;

public class Testing {
	public static void main(String argv[]) throws IOException {
		int anz; //Anzahl Reiskörner
		String str; 
		
		BufferedReader eingabe = new BufferedReader(new InputStreamReader(
				System.in));

		//Eingabe der Reiskörner 
		System.out.print("Bitte geben Sie die Anzahl der Reiskörner an:");

		//lesen des Eingabeobjektes 
		str = eingabe.readLine();

		//Umwandeln des datentyps string in Integer 

		anz = Integer.parseInt(str);

		//Berechnung 
		double tage = Math.log(anz) / Math.log(2);
		int tageR = (int)Math.round(tage);
		if((tage-tageR)>0) {
			tageR++;
		}
		
		System.out.println("Mach " + tageR + " Tagen wird die eingegebene Anzahl"
				+ "Reiskörner erreicht");
	}
}

habs nicht ausprobiert, aber wenn ich dein Problem richtig verstanden habe ist es sicher einfacher das ganze mit dem Logarithmus zu lösen, (2^x = Anzahl Reiskörner) und dann muss das x immer aufgerundet werden, also 2.1 zu 3 etc.....

ps: verwende doch bitte grosse Anfangsbuchstaben für die Klasse, also Testing und nicht testing (java convention) :)
 

Caesar

Aktives Mitglied
Es handelt sich bei der Geschichte um exponentielles Wachstum.

Der Reisbestand B nach 0 Tagen beträgt 1 Reiskorn:
B(0) = 1
Nach einem Tag hat sich das Ganze verdoppelt:
B(1) = B(0) * 2
Nach drei Tagen hat man wieder die doppelte Anzahl Reiskörner:
B(2) = B(1) * 2 = B(0) * 2²
usw.
Nach t Tagen:
B(t) = B(0) * 2^t
B(t) = 2^t

nach t auflösen:
t = log2( B(t) ) = log( B(t) ) / log(2)


Also genau das, was lin gemacht hat.
 
T

TheSunToucher

Gast
Die Anzahl der Reiskörner sollte auch nicht als int gespeichert werden, der wird überlaufen.
 

messi

Bekanntes Mitglied
Nicht den Bestand an Reiskörnern aller vorhergehenden Tage vergessen! Die geforderte Menge ist (fast) immer einen Tag früher erreicht.

Code:
Tag   Bestand
1:    1              =  2^0                    =  2^1 - 1  =  1
2:    2 + 1          =  2^1 + 2^0              =  2^2 - 1  =  3
3:    4 + 2 + 1      =  2^2 + 2^1 + 2^0        =  2^3 - 1  =  7
4:    8 + 4 + 2 + 1  =  2^3 + 2^2 + 2^1 + 2^0  =  2^4 - 1  =  15

Bestand = 2^Tag - 1

Tage = Aufrunden(log(Gefordert + 1) / log(2))
Code:
long gefordert;

double tageGenau = Math.log1p(gefordert) / Math.log(2.0);
int tage = (int) Math.ceil(tageGenau);
long bestand = (1L << tage) - 1;
 

Starmagic

Mitglied
hallo Freunde!!
Ich danke euch Vielmals für die ganzen ausführlichen Lösungsvorschläge^^
haben mir sehr geholfen

mfg StarMagic
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben