Hochzahlen in C-Programmierung

4 Antworten

Selbst die Funktion schreiben ;) Z.B.

int pot(int base, int potval)
{
    for (int i = 0; i < base; i++) // C99 Standard!!
    {
        base *= base;
    }

    return base;
}

So, hoffe ich hab jetzt nichts durcheinander gebracht^^

Grüße - Morph 8)


morphesus  07.03.2012, 23:02

Korrigiere: Da war n Fehler drin! Asche auf mein Haupt ^^ Hier nochmal die korrekte Funktion:

int potenz(int base, int potval)
{
    int i;
    for (i = 0; i < potval; i++) // C99 Standard!!
    {
        base *= base;
    }

    return base;
}

Varianten wie

int i = y³;

funktionieren leider nicht. Dafür ist es ja auch C ;) In anderen Sprachen könnte es vielleicht funktionieren ...

Grüße - Morph 8)

1
etmetm 
Fragesteller
 07.03.2012, 23:05
@morphesus

was bedeutet dieses i++? und base *=base bedeutet ja die basis wird mit der basis multipliziert. stimmts? wenn du auch die variablen erklären könnten würdest wäre ich dankbar...

1
morphesus  07.03.2012, 23:15
@etmetm

Natürlich, kein Thema :) Ich gehe das mal Stück für Stück durch.

Also als erstes ist da natürlich die Funktionsdeklaration. Diese soll einen int-Wert zurückgeben, eben unser gewünschtes Ergebnis. Du übergibst der Funktion zwei Werte: Die Basis und die Potenz (bei 10³ ist 10 die Basis und ³ die Potenz).

Das "int i" hatte ich jetzt nachgerüstet, damit auch nicht C99-konforme Compiler das Programm schlucken ^^ Es dient für die for-Schleife. In der Schleife wird dann die Potenz errechnet. 10³ entspricht ja nicht mehr als 10 * 10 * 10. Ist also an sich sehr leicht zu errechnen.

Das base *= base multipliziert den aktuellen Wert von Base ... Upps, da ist n Fehler ^^ Hier eine nochmals korrigierte Version (Sry, ist wohl schon ein wenig zu spät heute ...)

int potenz(int base, int potval)
{
    int i, tmp_base = base;
    for (i = 0; i < potval; i++) // C99 Standard!!
    {
        base *= tmp_base;
    }

    return base;
}

So. base *= tmp_base macht jetzt also nichts anderes als base mit dem ursprünglichen Wert von base zu multiplizieren.

Wenn du also z.B. das hier schreibst:

int ergebnis = potenz( 10, 3 );

Dann wird an sich diese Rechnung durchgeführt: 10 * 10 * 10

Soweit dazu, ich hoffe ich konnte es einigermaßen verständlich erläutern ... :) Und sry wegen der hohen Fehlerquote, ist sonst nicht der Fall -.-

Grüße - Morph 8)

1
morphesus  07.03.2012, 23:21
@cat64k

Habe auch gerade noch einen Fehler gefunden ... Ich bin urlaubsreif -.-

int potenz(int base, int potval)
{
    int i, tmp_base = base;
    for (i = 1; i < potval; i++) // C99 Standard!!
    {
        base *= tmp_base;
    }

    return base;
}

DAS MUSS jetzt aber funktionieren x_x

Grüße - Morph 8)

1
lethys  09.03.2012, 02:37
@morphesus

in perl schreibt man "n**p"

nur so zur information :)

1
morphesus  09.03.2012, 16:50
@lethys

Lesekompetenz, mein Freund. Es geht hier um C, nicht um Perl ...

Grüße - Morph 8)

1
cjohnson  27.03.2014, 09:25

C++ Programmierer hier, geht nicht

base=base^potval

auch?

1

Normal macht man das mit

pow(x,y);

Beispiel:

'#include <stdio.h>

'#include <math.h>

void main(void)

{

double x , y, ergebnis;

printf("\nx hoch y :");

printf("\nBitte x eingeben: ");

scanf("%lf", &x);

printf("\nBitte y eingeben:");

scanf("%lf", &y);

ergebnis =pow(x,y);

printf("\nergebnis: %lf", ergebnis);

printf("\nProgrammende");

}

Der Grund: Weil man pow( x hoch y) auch zum Wurzelziehen verwenden kann:

x hoch (1/y) ist die y-Wurzel aus x

2 hoch 0.5 ist die zweite Wurzel aus 2.

Da muss du zuerst die include <math.h> einbinden. Mit einer extra Funktion dafür: pow(); Mit pow(a,b) wird zum Beispiel die b-te Potenz zu a berechnet. Ein Tipp: a hoch (1/3) zieht die dritte Wurzel aus a. pow(x, (1/ 7)); liefert die siebte Wurzel aus x pow(x,(1/n)); liefert die n-te Wurzel aus x. Beispiel: wurzel = pow( a, (1/b); Dabei ist a der Radikand und b der Wurzelexponent. Die Funktion sqrt() dagegen liefert nur die Quadratwurzel einer Zahl.

Die plumpe Lösung wäre x = n * n * n.

Dann gibt es die ^-Variante: x = n^3.

Richtig elegant wird es, wenn man die „Basis“ und den „Exponenten“ in einer Variablen ablegt und dann folgendes schreibt:

result = base^exponent.

Dann könnte man noch Kernighan/Ritchie um Rat fragen oder hier nachlesen: http://openbook.galileocomputing.de/c_von_a_bis_z/