Problem Schleife

Chri2302

Grünschnabel
Hallo!

Ich bin neu hier und bin ein Anfänger in C++. Versuche mich darin seit zwei Wochen und habe folgendes Problem:

Ich soll ein Programm schreiben, das die Summe von n^n ausrechnet, d.h. wenn n=3 soll 1^1 + 2^2 + 3^3 ausgerechnet werden. Leider darf ich dafür keine pow Funktion verwenden.

Ich habe bisher folgenden Code geschrieben:

C++:
#include <iostream> 
using namespace std; 

int main() 	
{

int Zahl, y;

do 	{
      
cout << "Geben Sie eine natuerliche Zahl ein: ";
cin >> Zahl;

y = 0;

for (int x = 1; x<=Zahl; x++) {

y = y + (x * x);
					     }

cout << y;
cout << endl;


	} while (1);            
                     
}

Leider stimmt mein Programm nur bis 2^2. Ich könnte es zwar mit einer if Anweisung schreiben, dann würde das Programm aber ziemlich lang werden. Denke das es auch mit einer Schleife funktionieren müsste, habe aber leider keinen Plan wo ich da ansetzen soll.

Würde mich über Tipps freuen und wenn möglich bitte nicht zu kompliziert.

Danke
 
Hi und Willkommen bei tutorials.de,

du rechnest ja auch die Summe von n^2 tatt n^n aus.

Ein allgemeiner Tipp zuerst:
Auch bei solchen kleinen Programmen ist eine ordentliche Codeeinrückung sehr hilfreich.
Wo zB. Schleifen anfangen und aufhören ist bei deinem Code so nicht gut zu erkennen,
damit macht man sich selbst auch keinen Gefallen.


Eine Möglichkeit wäre, sich die pow-Funktion einfach selbst zu schreiben.
Oder, wie im folgenden Code, einfach direkt im main:
(Variablen teilweise umbenannt)
C++:
#include <iostream> 
using namespace std; 

int main()  
{
	int input, result;

	do
	{
		cout << "Geben Sie eine natuerliche Zahl ein: ";
		cin >> input;

		result = 0;
		for (int n = 1; n <= input; n++)
		{
			int npower = 1;

			//Von n runter zu 1 oder von 1 rauf zu n zählen
			//macht hier keinen wirklichen Unterschied
			for(int i = n; i > 0; i--)
			{
				npower *= i;
			}

			result += npower;
		}

		cout << result;
		cout << endl;
	} while (1);
}
Was man eigentlich noch machen sollte: Für große n würde das Endergebnis
zu groß für int-Variablen (dann bekommt man zwar auch eine Zahl raus, aber eine falsche).
Das könnte man noch im Code prüfen und ggf. eine Meldung ausgeben,
dass die Eingabe zu groß war (Details falls wenn du das machen willst,
ist nämlich etwas länger zu erklären)
(edit: Mit 64bit-Variablen kommt man bis inkl. Eingabe 15)

(edit: Totalen Unsinn entfernt. Hab wohl auch an ^2 gedacht).
 
Hallo Chri2302,
du brauchst insgesamt 2 Schleifen: Eine die von 1 bis n zählt (Laufvariable z.B. i), und eine andere die i dann i mal mit sich selbst multipliziert.
So in etwa:
C++:
long Ergebnis = 0; //späteres Ergebnis
long Puffer = 0; //ein Puffer für die Subroutine
for (int i = 1; i <= n; i++){ //führe für jede Zahl 1 ... n aus
    Puffer = 1;
    for (int j = 0; j < i; j++){ //führe i mal aus
        Puffer *= i; //rechne mal i (entspricht dann i^i)
    }
    Ergebnis += Puffer; //zähle für diese natürliche Zahl i^i drauf
}
//gib Ergebnis aus

Code ist nicht getestet, aber ich denke du verstehst schon ;)

Gruß Technipion

Edit: Ah okay, sheel war mal wieder schneller :D
 
Hallo!

Erstmal danke für die Antworten.

Hab es jetzt verstanden. Hat ein wenig gedauert da ich mich erst in die speziellen Operatoren einlesen musste.

Auf jeden Fall danke an beide.

Hab jetzt die Version von Technipion verwendet.

@ sheel: Will nicht unhöflich sein, aber es war ein kleiner Fehler in deinem Code:

Zeile 22: npower *= n;

Hier jetzt die komplette Lösung:

C++:
#include <iostream> 
using namespace std; 

int main() 	
{

do 	{

int n;
long Ergebnis = 0; //späteres Ergebnis
long Puffer = 0; //ein Puffer für die Subroutine

   
	cout << "Geben Sie eine natuerliche Zahl ein: ";
	cin >> n;

		for (int i = 1; i <= n; i++)
		{ //führe für jede Zahl 1 ... n aus

    	Puffer = 1;
    
    		for (int j = 0; j < i; j++)
			{ //führe i mal aus
        	Puffer *= i; //rechne mal i (entspricht dann i^i)
    		}
    		
    	Ergebnis += Puffer; //zähle für diese natürliche Zahl i^i drauf
		}

cout << Ergebnis;
cout << endl;

	} while (1);             
                    
}
 
Zurück