Skocz do zawartości


Dentysta Gliwice



- - - - -

Program Obliczjący Silnię W C++


2 odpowiedzi w tym temacie

#1 iwonka7771

    Bywalec

  • Użytkownicy
  • Pip
  • 37 postów

Napisano 13 grudzień 2006 - 22:28





Mam mały problemik.Wogóle nie mam głowy do pisania programów w C++,a żeby zaliczyc semestr musze napisac program obliczający silnię z liczby n.:/ .Jak ktos wie jak to zrobic prosze o pomoc.Z góry dziekuje

Kasia R.

  • Użytkownicy
  • PipPipPipPipPipPip
  • 2899 postów
  • PłećKobieta

dentysta Gliwice


#2 snaut

    Wyjadacz

  • Użytkownicy
  • PipPipPip
  • 498 postów

Napisano 14 grudzień 2006 - 23:26

Nic prostszego już się nie da wymyślić.
Jakbyś pogooglowała to na 100% byś znalazła...

int silnia(int n){
if(n>0)
return n*silnia(n--);
else
return 1;
}

Nie sprawdzałem czy działa ale nie ma prawa nie działać.

Uprzedzam, działa tylko dla małych liczb, dla większych to już jest trochę bardziej pracochłonne a mi się nie chcę.

EDIT:
OO, a jednak kiedyś robiłem coś takiego i nawet kod na dysku znalazłem. Nie pamiętam czy działało(chyba 100! - (cos kolo 160 cyfr) liczyło poprawnie) i że było to jakiś czas temu to nie przyznaje się do tego kodu, dzisiaj napisałbym znacznie ładniejszy.
#include <stdio.h>
class BigDecimal{
public:
int number[200];
int start;
BigDecimal(int num, BigDecimal & per);
BigDecimal(){}
void multipy(int a, BigDecimal & b);
void add(int * a,int *b);
void wypisz();
void obetnij();
};
BigDecimal::BigDecimal(int num, BigDecimal & per){
multipy(num, per);
}
void BigDecimal::wypisz(){
for(int i=start;i<200;i++)printf("%d",number[i]);
}
void BigDecimal::multipy(int a, BigDecimal & b){
int* a1;
int* a2;
int af,as;
af=(int)a/10;
as=a-10*af;
a1= new int[200];
a2= new int[200];
a2[199]=0;
for(int c=0;c<=199;c++)a1[c]=0;
for(int d=0;d<=198;d++)a2[d]=0;
for(int i=199;i>0;i--){
a1[i]=b.number[i]*as;
a2[i-1]=b.number[i]*af;
}
a1[0]=0;
add(a1,a2);
delete a1,a2;
}
void BigDecimal::add(int *a,int *b){
for(int i=199;i>=0;i--){
number[i]=a[i]+b[i];
}
obetnij();
for(int i=0;i<200;i++){
if(number[i]!=0){
start=i;
break;
}
}
}
void BigDecimal::obetnij(){
int c=0;
for(int i=199;i>0;i--){
number[i]+=c;
if(number[i]>=10){
c=(int)number[i]/10;
number[i]-=c*10;
}else{
c=0;
}
}
}
int main(){
BigDecimal tab[100];
BigDecimal a;
a.start=199;
a.number[199]=1;
tab[0]=a;
tab[1]=a;
int t,n,end;
end=1;
t=0;
n=0;
scanf("%d",&t);
for(int i=2;i<=99;i++)tab[i]= BigDecimal(i,tab[i-1]);
for(int i=1;i<=t;i++){
scanf("%d",&n);
if(n!=100){
tab[n].wypisz();
printf("\n");
}else{
tab[99].wypisz();
printf("%d%d\n",0,0);
}
}
return 0;
}

Fuj :bag: , te pomieszane polsko, angielskie nazwy, wcięcia mi zjadło, nie przyznaje się do tego...

Użytkownik snaut edytował ten post 14 grudzień 2006 - 23:52


#3 iwonka7771

    Bywalec

  • Użytkownicy
  • Pip
  • 37 postów

Napisano 15 grudzień 2006 - 20:26





Wyświetl postUżytkownik snaut dnia 14.12.2006, 23:26 napisał

Nic prostszego już się nie da wymyślić.
Jakbyś pogooglowała to na 100% byś znalazła...

int silnia(int n){
if(n>0)
return n*silnia(n--);
else
return 1;
}

Nie sprawdzałem czy działa ale nie ma prawa nie działać.

Uprzedzam, działa tylko dla małych liczb, dla większych to już jest trochę bardziej pracochłonne a mi się nie chcę.

EDIT:
OO, a jednak kiedyś robiłem coś takiego i nawet kod na dysku znalazłem. Nie pamiętam czy działało(chyba 100! - (cos kolo 160 cyfr) liczyło poprawnie) i że było to jakiś czas temu to nie przyznaje się do tego kodu, dzisiaj napisałbym znacznie ładniejszy.
#include <stdio.h>
class BigDecimal{
public:
int number[200];
int start;
BigDecimal(int num, BigDecimal & per);
BigDecimal(){}
void multipy(int a, BigDecimal & b);
void add(int * a,int *b);
void wypisz();
void obetnij();
};
BigDecimal::BigDecimal(int num, BigDecimal & per){
multipy(num, per);
}
void BigDecimal::wypisz(){
for(int i=start;i<200;i++)printf("%d",number[i]);
}
void BigDecimal::multipy(int a, BigDecimal & b){
int* a1;
int* a2;
int af,as;
af=(int)a/10;
as=a-10*af;
a1= new int[200];
a2= new int[200];
a2[199]=0;
for(int c=0;c<=199;c++)a1[c]=0;
for(int d=0;d<=198;d++)a2[d]=0;
for(int i=199;i>0;i--){
a1[i]=b.number[i]*as;
a2[i-1]=b.number[i]*af;
}
a1[0]=0;
add(a1,a2);
delete a1,a2;
}
void BigDecimal::add(int *a,int *b){
for(int i=199;i>=0;i--){
number[i]=a[i]+b[i];
}
obetnij();
for(int i=0;i<200;i++){
if(number[i]!=0){
start=i;
break;
}
}
}
void BigDecimal::obetnij(){
int c=0;
for(int i=199;i>0;i--){
number[i]+=c;
if(number[i]>=10){
c=(int)number[i]/10;
number[i]-=c*10;
}else{
c=0;
}
}
}
int main(){
BigDecimal tab[100];
BigDecimal a;
a.start=199;
a.number[199]=1;
tab[0]=a;
tab[1]=a;
int t,n,end;
end=1;
t=0;
n=0;
scanf("%d",&t);
for(int i=2;i<=99;i++)tab[i]= BigDecimal(i,tab[i-1]);
for(int i=1;i<=t;i++){
scanf("%d",&n);
if(n!=100){
tab[n].wypisz();
printf("\n");
}else{
tab[99].wypisz();
printf("%d%d\n",0,0);
}
}
return 0;
}

Fuj :bag: , te pomieszane polsko, angielskie nazwy, wcięcia mi zjadło, nie przyznaje się do tego...




ok,śliczne dzięki.niestety niemam głowy do pisania w c++ :/. return n*silnia(n--);-miałam cos podobnego w programie który prubowałam napisac i facio sie przyczepił n*-własnie tego,ponoc nie mielismy takiej komendy czy jak to zwą.jestem totalną nogą w tym c++.serdeczne dzięx :*




Dodaj odpowiedź



  







Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych