Potenze

Stato
Discussione chiusa ad ulteriori risposte.

Robertof

Utente Silver
19 Giugno 2008
186
10
0
98
Scrivere, nel proprio linguaggio preferito, una funzione per effettuare potenze (non il semplice base ^ esponente eh, una funzione proprio vostra).

PHP:
PHP:
<?php
function potenza($base, $esponente) {
	if (!is_numeric($base) or !is_numeric($esponente)) return false;
	$fatt = array();
	for ($i = 1; $i <= $esponente; $i++) {
		$fatt[] = $base;
	}
	$eval=implode(' * ',$fatt);
	eval ("\$result = $eval;");
	return $result;
}
?>

Buona serata.
 
Codice:
#define PW(x)                        (x)*(x);
ma eleva solo per due...
allora:
Codice:
int elevamento(a, b){
      int n;
      for(n=0;n<=b;n++){
               a *= a;
      }
}
 
Autoit
Io non ho creato la funzione ma proprio lo script :D
Codice:
$1=InputBox("numero","numero")
$2=InputBox("potenza","potenza")
If $2=0 Then
	MsgBox(0,"risultato","1")
Else
	$3=1
	$risultato=$1
	While $3 < $2
		$risultato=Execute($risultato*$1)
		$3=$3+1
	WEnd
	MsgBox(0,"risultato",$risultato)
EndIf
Exit
 
kr1pn0$ ha detto:
Codice:
#define PW(x)                        (x)*(x);
ma eleva solo per due...
allora:
Codice:
int elevamento(a, b){
      int n;
      for(n=0;n<=b;n++){
               a *= a;
      }
}

Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
 
@kripnos: :ngheluver: ti uccideròòò
edit: ecco il mio comunque (non testato)...in c++:

Codice:
int lepower(int base, int esponente)
{
  int ris, i;
   if (b=0) ris=1;
   else if (b=1) ris=base;
   else {for (i=2; i<=esponente; i++) {base=(*base);} ris=base;}
   return ris
}

CODICE SCAZZATO COMPLETAMENTE
 
[C]
Codice:
#include <stdio.h>
int my_pow(int base, int esp) {
  int tot=1, i;
  for (i=0; i<esp; i++) {
    tot*=base;
  }
  return tot;
}
int main () {
  int base, esp, tot;
  printf("Inserisci la base:");
  scanf("%d", &base);
  printf("Inserisci l'esponente:");
  scanf("%d", &esp);
  tot=my_pow(base, esp);
  printf("Totale: %d", tot);
  fflush(stdin);
  getchar();
  return 0;
}

[Ruby]
Codice:
def my_pow(base, esp)
  $tot=1
  esp.times do 
    $tot*=base
  end
  return $tot
end
puts my_pow(gets().to_i, gets().to_i)
 
ecco, questo funziona, ma solo per le potenze con esponente diverso da 2 o 3, ma non inferiore a 0(non ho ancora capito perchè)
Codice:
#include <iostream>
using namespace std;

int lepower(int base, int esponente);

int main()
{
    int x, y, ris;
    cout << "Inserisci la base" << endl;
    cin >> x;
    cout << "Inserisci l'esponente" << endl;
    cin >> y;
    ris=lepower(x,y);
    cout << "Il Risultato E': " << ris << endl;
}
    
    

int lepower(int base, int esponente)
{
   int ris, i;
   if (esponente==0) ris=1;
   else if (esponente==1) ris=base;
   else {for (i=2; i<=esponente; i++) {base*=base;} ris=base;}
   return ris;
}

edit: anzi, funziona solo con le potenze dello 0, dell' 1 e del 4...-.-

riedit: ora ho capito come si fa....!! grazie al codice di opocaj ovviamente...xD
 
lepa ha detto:
ecco, questo funziona, ma solo per le potenze con esponente diverso da 2 o 3, ma non inferiore a 0(non ho ancora capito perchè)
Perché se come esponente passi 0 ti ritorna 1, se passi 1 ti ritorna base, ma se passi 2 non soddisfa neanche il for, perché 2<2 è impossibile, e quindi va in panne.
Metti i=1 nel for, così se l'esponente è 2 base*=base viene eseguito una volta, come è giusto che sia.
 
sisi, non importa, perchè ripensandoci è più giusto come hai fatto te, facendo così se per esempio la base è 2, se come esponente metto alla 5a, mi da 256 perchè mi farebbe base=16*16...
l'unica alternativa che conosco sarebbe quella di usare i puntatori, assegnando al puntatore il valore di base, lasciando così invariata la base, e siccome devo andare a letto lo farò domani a scuola.
 
~Ste ha detto:
Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
no problem..
Codice:
int elevamento(a, b){
 int n;
 if(b>=2){ for(n=1;n<=b;n++){ a *= a; } 
      if(b==1){  }
             if(b==0){a = 1; }
 return a;
}
ok?
 
kr1pn0$ ha detto:
~Ste ha detto:
Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
no problem..
Codice:
int elevamento(a, b){
 int n;
 if(b>=2){ for(n=1;n<=b;n++){ a *= a; } 
      if(b==1){  }
             if(b==0){a = 1; }
 return a;
}
ok?
hai racchiuso un if b = 1 ed un if b = a 0 in un if b>=2
Mi spieghi come fa a funzionare?
 
~Ste ha detto:
kr1pn0$ ha detto:
~Ste ha detto:
Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
no problem..
Codice:
int elevamento(a, b){
 int n;
 if(b>=2){ for(n=1;n<=b;n++){ a *= a; } 
 if(b==1){  }
 if(b==0){a = 1; }
 return a;
}
ok?
hai racchiuso un if b = 1 ed un if b = a 0 in un if b>=2
Mi spieghi come fa a funzionare?
if() esegue il controllo non appena dichiarata....
non si occupa di controllare se la condizione varia al interno...
ad esempio:
Codice:
int n = 3;
if(n==3){
        n+=1;
        printf("N adesso vale 1....");
}
// non interompe il ciclo..
poi:
- non sono al interno:
if(b>=2){ for(n=1;n<=b;n++){ a *= a; }
if(b==1){ }
if(b==0){a = 1; }
 
kr1pn0$ ha detto:
~Ste ha detto:
kr1pn0$ ha detto:
~Ste ha detto:
Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
no problem..
Codice:
int elevamento(a, b){
 int n;
 if(b>=2){ for(n=1;n<=b;n++){ a *= a; } 
 if(b==1){  }
 if(b==0){a = 1; }
 return a;
}
ok?
hai racchiuso un if b = 1 ed un if b = a 0 in un if b>=2
Mi spieghi come fa a funzionare?
if() esegue il controllo non appena dichiarata....
non si occupa di controllare se la condizione varia al interno...
ad esempio:
Codice:
int n = 3;
if(n==3){
        n+=1;
        printf("N adesso vale 1....");
}
// non interompe il ciclo..
poi:
- non sono al interno:
if(b>=2){ for(n=1;n<=b;n++){ a *= a; }
if(b==1){ }
if(b==0){a = 1; }

Sei all'interno dell'if perchè non hai chiuso la prima volta le parentese graffe

if(b>=2){ for(n=1;n<=b;n++){ a *= a; }
quelle sono del for non dell'if

Ora che controllo anche questo non va bene:
Devi usare 1 altra variabile
esempio
2 alla terza
1)2*2=4
2)4*4=16(anzicchè 4*2=8 dato che a varrà 4 e non 2)
OT:Rob scusami se sto correggendo io l'esercizio xD
 
~Ste ha detto:
kr1pn0$ ha detto:
~Ste ha detto:
kr1pn0$ ha detto:
~Ste ha detto:
Non va bene il tuo perchè se b vale 0 esegue lo stesso la moltiplicazione invece di darti 1 come risultato. Poi se il valore iniziale di n è 0 devi mettere strettamente minore di b se invece lo fai partire da 1 puoi metterlo minore o uguale altrimenti ti restituisce il numero a elevato alla b+1
no problem..
Codice:
int elevamento(a, b){
 int n;
 if(b>=2){ for(n=1;n<=b;n++){ a *= a; } 
 if(b==1){  }
 if(b==0){a = 1; }
 return a;
}
ok?
hai racchiuso un if b = 1 ed un if b = a 0 in un if b>=2
Mi spieghi come fa a funzionare?
if() esegue il controllo non appena dichiarata....
non si occupa di controllare se la condizione varia al interno...
ad esempio:
Codice:
int n = 3;
if(n==3){
        n+=1;
        printf("N adesso vale 1....");
}
// non interompe il ciclo..
poi:
- non sono al interno:
if(b>=2){ for(n=1;n<=b;n++){ a *= a; }
if(b==1){ }
if(b==0){a = 1; }

Sei all'interno dell'if perchè non hai chiuso la prima volta le parentese graffe

if(b>=2){ for(n=1;n<=b;n++){ a *= a; }
quelle sono del for non dell'if

Ora che controllo anche questo non va bene:
Devi usare 1 altra variabile
esempio
2 alla terza
1)2*2=4
2)4*4=16(anzicchè 4*2=8 dato che a varrà 4 e non 2)
OT:Rob scusami se sto correggendo io l'esercizio xD


si scusa è un errore di distrazione....
 
Python:
Codice:
#!/usr/bin/python
def pow(b,e):
	c = b;
	for i in range(1,e):
		c *= b;
	return c;
perl:
Codice:
#!/usr/bin/perl
sub poww {
	$b = shift;
	$e = shift;
	$c = $b;
	for($i=1;$i<$e;$i++) {
		$c *= $b;
	}
	return $c;
}
 
Visto che in C c'era già l'ho fatta ricorsiva...penso sia molto sintetica
Codice:
int powa(int base,int esp){
	if(!esp) return 1;
	if(esp==1) return base;
	return base*powa(base, esp-1);
}
 
Definizione:
Codice:
def kripower( base, esponente)
        x = 0
        tot = 1
        while x <= esponente
              tot  = tot * base
              x += 1
        end
end
script usante le TK che implementa il suddetto metodo
Codice:
require "tk"
def kripower( base, esponente)
        x = 0
        tot = 1
        while x < esponente
              tot  = tot * base
              x += 1
        end
        return tot
end
puts "Inserisci la base:"
base = gets.chomp.to_i
puts "Esponente"
esp = gets.chomp.to_i
val = kripower(base, esp)
hello = TkRoot.new do
title "Hello World" 
minsize(100,40)
end
TkLabel.new(hello) do
text val
foreground 'orange'
pack { padx 15; pady 15; side 'left'}
end
Tk.mainloop
 
La mia funzione in C:
Codice:
int powernum(int esp, int num)
{
    int potenza=num;
    while(esp>1)
    {
                 esp--;
                 potenza *= num;
    }
    return potenza;
}
Invece l'intero codice con il main:
Codice:
#include <stdio.h>

int power(int esp, int num)
{
    int potenza=num;
    while(esp>1)
    {
                 esp--;
                 potenza *= num;
    }
    return potenza;
}

int main()
{
    int esponente, num;
    printf("Inserisci il numero:\n");
    scanf("%d", &num);
    printf("Inserisci l'esponente:\n");
    scanf("%d", &esponente);
    if(num>0 && esponente>0)
    printf("La potenza e': %d\n", powernum(esponente,num));
    else
    printf("Errore!");
    fflush(stdin);
    getchar();
}


vorrei anche farlo in PHP ma è inutile gia l'ha fatto robertof, e poi scriverei di nuovo uno dei algoritmi gia utilizzati quindi...
 
Visto che hai riaperto la discussione posto il mio primo programma in cpp :D
Codice:
#include<iostream>

using namespace std;

int powa(int base,int esp){
    if(!esp) return 1;
    if(esp==1) return base;
    return base*powa(base, esp-1);
}

int main()
{
    int base, exp;
    cout << "Inserisci la base"<<endl;
    cin >> base;
    cout << "Inserisci l'esponente"<<endl;
    cin >> exp;
    cout << "La potenza di " << base << " elevato alla " << exp << " è "
         << powa(base, exp) << endl;
    #if defined(WIN32)
        system("pause");
    #endif
    return 0;
}
 
ShuraBozz ha detto:
Visto che hai riaperto la discussione posto il mio primo programma in cpp :D
Codice:
#include<iostream>

using namespace std;

int powa(int base,int esp){
    if(!esp) return 1;
    if(esp==1) return base;
    return base*powa(base, esp-1);
}

int main()
{
    int base, exp;
    cout << "Inserisci la base"<<endl;
    cin >> base;
    cout << "Inserisci l'esponente"<<endl;
    cin >> exp;
    cout << "La potenza di " << base << " elevato alla " << exp << " è "
         << powa(base, exp) << endl;
    #if defined(WIN32)
        system("pause");
    #endif
    return 0;
}

Bella shurabozz, mi è piaciuto come hai scritto la funzione in modo ricorsivo, non ci avevo pensato!
 
solo hai ragione, corretto
Codice:
#include<iostream>

using namespace std;

int powa(int base,int esp){
    if(!esp) return 1;
    if(esp==1) return base;
    return base*powa(base, esp-1);
}

int main()
{
    int base, exp;
    cout << "Inserisci la base"<<endl;
    cin >> base;
    cout << "Inserisci l'esponente"<<endl;
    cin >> exp;
    if(exp<0){
    	cout << "Non fare il co******" << endl;
    	return 0;
    }
    cout << "La potenza di " << base << " elevato alla " << exp << " è "
         << powa(base, exp) << endl;
    #if defined(WIN32)
        system("pause");
    #endif
    return 0;
}
 
-.- L'esponente minore di zero è possibilissimo :omfg:
2^-2 = 1/(2^2) = 1/4 = 0.25

Solo si riferiva al fatto che il tuo algoritmo non gestisce questa eventualità.
 
Stato
Discussione chiusa ad ulteriori risposte.