/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Faktorial Værdi
Fra : lars09


Dato : 20-09-02 15:52

HEj

Håber der er nogle som kan hjælpe

Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette

eks. 5 og dets faktoriale værdi = 5 * 4 * 3 *2 * 1 eller
n-1

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


 
 
Bertel Lund Hansen (20-09-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-09-02 15:45

lars09 skrev:

>Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
>den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette

Skriv en funktion der beregner den.

   // Virker ikke for 0 og går i spåner ved negative tal.
   int fakultet (int tal) {
      if (tal=1) return 1;
      return tal*fakultet(tal-1);
   }

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Morten F. Hansen (20-09-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 20-09-02 16:33


"Bertel Lund Hansen" <nospam@lundhansen.dk> wrote:
> // Virker ikke for 0 og går i spåner ved negative tal.
> int fakultet (int tal) {
> if (tal=1) return 1;
> return tal*fakultet(tal-1);
> }

Så kunne man måske bruge:

if (tal <= 1) return 1;

så virker den nemlig som den skal for nul og går ikke død hvis "tal" er
negativt.



Morten F. Hansen (20-09-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 20-09-02 16:41

> "Bertel Lund Hansen" <nospam@lundhansen.dk> wrote:
> > // Virker ikke for 0 og går i spåner ved negative tal.
> > int fakultet (int tal) {
> > if (tal=1) return 1;
> > return tal*fakultet(tal-1);
> > }
> Så kunne man måske bruge:
> if (tal <= 1) return 1;
> så virker den nemlig som den skal for nul og går ikke død hvis "tal" er
> negativt.

Der skal forresten også stå "tal == 1" og ikke "tal = 1" nu vi er igang



Bertel Lund Hansen (20-09-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-09-02 16:54

Morten F. Hansen skrev:

>Så kunne man måske bruge:
>if (tal <= 1) return 1;

Ja, men hvis man ved at man kun benytter positive tal, er det
hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
er vokset op med sprog der ikke brugte det tegn.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Anders Bo Rasmussen (20-09-2002)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 20-09-02 17:10

On Fri, 20 Sep 2002 17:53:57 +0200,
Bertel Lund Hansen <nospam@lundhansen.dk> wrote:

>>Så kunne man måske bruge:
>>if (tal <= 1) return 1;
>
> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
> er vokset op med sprog der ikke brugte det tegn.

Nu var det et vilkårligt tal der blev spurgt om, så rutinen bør kunne
tage fakultet(0).

--
Anders Bo Rasmussen
* Du har en solid edb-mæssig basisuddannelse EDB-assistent eller ligende.
* Du er serviceminded og selvstændig. Du har erfaring med indkøb, opsætning og
bruger support.

Morten F. Hansen (20-09-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 20-09-02 17:14

> >Så kunne man måske bruge:
> >if (tal <= 1) return 1;
> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden.

Jeg tror det er det samme.

== bliver sikkert oversat til noget i retning af:

; hop forbi return hvis tal ikke er 1
cmp ax, 1
jne @skip_return_statement

mens <= bliver oversat til:

; hop forbi return hvis tal er større end 1
cmp ax, 1
jg @skip_return_statement

Begge jump-instruktioner har samme clocks (ihvertfald på de Intel CPU'er jeg
kender).



Morten F. Hansen (20-09-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 20-09-02 18:04


> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
> er vokset op med sprog der ikke brugte det tegn.

Hvis det er hastigheden man går efter kan man jo bruge følgende:

int fast_fakultet(int n)
{
static int lookup[13] = {
1, 1, 2, 6, 24, 120, 720, 5040, 40320,
362880, 3628800, 39916800, 479001600
};
if (n < 0 || n > 12)
return 0;
else
return lookup[n];
}

Hvis man arbejder på en maskine med signed 32-bit ints, dør den jo alligevel
efter 12!



Anders Bo Rasmussen (20-09-2002)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 20-09-02 16:42

On Fri, 20 Sep 2002 16:44:48 +0200,
Bertel Lund Hansen <nospam@lundhansen.dk> wrote:

>>Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
>>den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette
>
> Skriv en funktion der beregner den.
>
>    // Virker ikke for 0 og går i spåner ved negative tal.
>    int fakultet (int tal) {
>       if (tal=1) return 1;

Her returnerer vi altid 1.

>       return tal*fakultet(tal-1);
>    }

fakultet(0) går i uendelig løkke.

--
Anders Bo Rasmussen
* Du har en solid edb-mæssig basisuddannelse EDB-assistent eller ligende.
* Du er serviceminded og selvstændig. Du har erfaring med indkøb, opsætning og
bruger support.

lars09 (20-09-2002)
Kommentar
Fra : lars09


Dato : 20-09-02 17:42

Tak for svaret Anders Bo Rasmussen.
                        

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


Ulrik Magnusson (21-09-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 21-09-02 10:34

Bertel Lund Hansen wrote:

> Skriv en funktion der beregner den.
>
> // Virker ikke for 0 og går i spåner ved negative tal.
> int fakultet (int tal) {
> if (tal=1) return 1;
> return tal*fakultet(tal-1);
> }

Det var måske på sin plads også at præsentere den ikke-rekursive:

size_t fakultet( size_t tal )
{
size_t res = 1;
while( tal > 0 )
{
res *= tal;
tal--;
}
return res;
}

Ulrik Magnusson


Jens Axel Søgaard (21-09-2002)
Kommentar
Fra : Jens Axel Søgaard


Dato : 21-09-02 14:31

Ulrik Magnusson wrote:
> Bertel Lund Hansen wrote:
>
>> Skriv en funktion der beregner den.
>>
>> // Virker ikke for 0 og går i spåner ved
>> negative tal. int fakultet (int tal) {
>> if (tal=1) return 1;
>> return tal*fakultet(tal-1);
>> }
>
> Det var måske på sin plads også at præsentere den ikke-
> rekursive:

Enig.

> size_t fakultet( size_t tal )
> {
> size_t res = 1;
> while( tal > 0 )
> {
> res *= tal;
> tal--;
> }
> return res;
> }

Den oprindelige spørger var vist lige begyndt på C, så her
er en version uden *= og --.

/* fakultet : 0,1,... -> heltal
udregner fakultet af n, altså n*(n-1)*...*3*2*1
eksempler: faktultet(0)=1, fakultet(1)=1, fakultet(5)=120
*/
int fakultet( int n ) {
int resultat = 1;
while( n > 0 ) {
resultat = resultat * n;
n = n - 1;
}
return resultat;
}

Variablen resultat opsamler lidt efter lidt resultatet, for vi ganger et
tal på ad gangen. Man kalder en sådan variabel for en akkumulator.

--
Jens Axel Søgaard




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste