DeaD_BY

Kayıt : 17 Eylül 2009 İstanbul
|
|
Faktoryel 10'a 0 diyor mesela..Bi nedeni vardı,int değerlerin uzunlugu hakkında..Neydi hocalar?
#include int main () { int value; printf("Enter the value:"); scanf("%d",&value); int sonuc; sonuc=factorial(value); printf("Factorial of %d is : %d \n ", value,sonuc); return 0; } int factorial(int fact) { if(fact<=1) return 1; else return(fact*factorial(fact-1)); }
BilenYok.Com - İlginç Bilgiler Ansiklopedisi!
|
|
|
Sonucun değerini double yap.int 32000 üstünde çalışmaz.
Mühendis kahveyi projeye dönüştüren bir insan evladıdır.
|
ltcelik

Kayıt : 11 Mayis 2007 YENİGÜN MAALLESİ
|
|
return(fact*factorial(fact-1));
---------
fact =?
Edit: bu kod derleniyor mu?...
Algoritman da yanlış gözüküyor..
Programın amacı ne?
Bir de fonksiyon kendi kendini çağırıyor??
EPoX Af550G pro /2GB RAM/ winXP Pirated Edişın** özür dileyeni . . .
|
ltcelik

Kayıt : 11 Mayis 2007 YENİGÜN MAALLESİ
|
|
sandman bunu yazdı: -----------------------------
Sonucun değerini double yap.int 32000 üstünde çalışmaz.
-----------------------------
int tanımlı bir sayı double yapmak gerekszidir her halde fakat unsigned tanımlamak daha doğrudur...
EPoX Af550G pro /2GB RAM/ winXP Pirated Edişın** özür dileyeni . . .
|
j4x

Kayıt : 16 Temmuz 2005 Istanbul
|
|
int derleyicinin türüne ve ayarına göre short int yada long int e çevrilecektir.
Vc++ için default olarak long int yani 32 bit signed integer olacaktır.
short int: -32768...32767 arası değer alır, long int ise -2^31....+2^31-1 aralığında değer alabilir yani -2 milyar küsürden +2 milyar küsüre.
Unsigned yaparsan bu türleri alabildiği max değer 2 katına çıkar fakat negatif değer alamaz, alabildiği en küçük değer 0 olur.
Sen int veri türüyle daha büyük sayılarla çalışamazsın. Arkadaşın dediği gibi double kullanabilirsin fakat o da 14 digitten sonra precisonu yitirir.
Faktoriyel programi için kafani kariştirmaya değmez, ilerde yapıları fln gördüğünde anlarsın bunu nasıl aşabileceğini.
Eski gVeR.
|
ltcelik

Kayıt : 11 Mayis 2007 YENİGÜN MAALLESİ
|
|
EPoX Af550G pro /2GB RAM/ winXP Pirated Edişın** özür dileyeni . . .
|
ltcelik

Kayıt : 11 Mayis 2007 YENİGÜN MAALLESİ
|
|
#include #include
using namespace std;
int main(int argc, char *argv[]) { unsigned fakt; //int fakt; int say,i; cin>>say; fakt=1; for (i=say;i>1;i--) { fakt=fakt*i; } cout<< fakt<<endl; system("PAUSE"); return EXIT_SUCCESS; }
*** c++ kodu 10 için doğru veriyor..
EPoX Af550G pro /2GB RAM/ winXP Pirated Edişın** özür dileyeni . . .
|
sLeymN

Kayıt : 31 Mart 2008 Adana
|
|
ltcelik bunu yazdı: -----------------------------
return(fact*factorial(fact-1));
---------
fact =?
Edit: bu kod derleniyor mu?...
Algoritman da yanlış gözüküyor..
Programın amacı ne?
Bir de fonksiyon kendi kendini çağırıyor??
-----------------------------
özyineleme kullanmış hocam yanlış olan bir şey yok..
ayrıca int ın boyutlarını aştığın için öyle oluyor (:
long int olarak ya da double olarak tanımlarsan sorun ortadan kalkar ama fazla kasmaya gerek yok altı üstü faktoriyel programı
Cehennemin dibine kadar yolum var daha.. || www.logicalarea.com
|
|
|
buyur hacı bunu dene <br>
void faktoryel(int sayi) { #define BASAMAK 300 unsigned s,i,aktif,dizi[BASAMAK]={0}; dizi[BASAMAK-1]=s=1; aktif=BASAMAK-1; while(s<=sayi) { for(i=0;i<BASAMAK;++i) dizi[i]*=s; for(i=1;i<BASAMAK;++i) { dizi[BASAMAK-(i+1)]+=(dizi[BASAMAK-i]/10); dizi[BASAMAK-i]%=10; if(dizi[BASAMAK-(i+1)]) aktif=BASAMAK-(i+1); if(dizi[0]>1000000) printf("Yetersiz alan BASAMAK = %u\n",BASAMAK); } ++s; } for(i=aktif;i<BASAMAK;++i) printf("%d",dizi[i]); }
<br>
yeterli alan olursa 400 milyona kadar faktoryel alabilirsin basamagı yükseltmen yeter
|
|