/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
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
Vist : 686 gange
50 point
Dato : 20-09-02 16: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

 
 
Kommentar
Fra : lars09


Dato : 20-09-02 17:06

Kan den ikke også laves i en for-løkke, i så fald hvordan skal den se ud

Kommentar
Fra : Nyhedsbruger


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/

Kommentar
Fra : Nyhedsbruger


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.



Kommentar
Fra : Nyhedsbruger


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



Accepteret svar
Fra : Nyhedsbruger

Modtaget 60 point
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.

Godkendelse af svar
Fra : lars09


Dato : 20-09-02 18:42

Tak for svaret Anders Bo Rasmussen.
                        

Kommentar
Fra : Nyhedsbruger


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/

Kommentar
Fra : Nyhedsbruger


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.

Kommentar
Fra : Nyhedsbruger


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).



Kommentar
Fra : Nyhedsbruger


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!



Kommentar
Fra : Nyhedsbruger


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


Kommentar
Fra : Nyhedsbruger


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




Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste