C faktöriyel fonksiyonu çağrılması hata-*çözüldü*

virgo2000
06-03-2011, 21:29   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
14 mesaj
Kayıt Tarihi:Kayıt: May 2009

C de bir programın içinde kullanmak için yazdığım faktöriyel fonksiyonu şöyle : 

long fakt(long q)
{   long sonuc;
    sonuc = 1;
          while(q != 0)
          {   sonuc = sonuc * q;
              q = q - 1;   
          }
    return sonuc;
}   

Fonksiyonu çağırdığımda 13 e kadar olan sayıların faktöriyelini alıyor fakat 13 ve 13 ten sonra yanlış hesaplıyor. (Aynı fonksiyonu for ile de yazdım yine 13 ten sonra yanlış hesapladı)

Aynı algoritmayla fonksiyon çağırmadan yazınca tüm sayıları doğru hesaplıyor.

Bunun sebebi ne olabilir sizin de başınıza geldi mi? Programlamada yeniyim de...

bu arada yazdığım kodlar altta 4.mesajda

Son Düzenleme: virgo2000 ~ 07 Mart 2011 04:00
censez41
06-03-2011, 21:45   |  #2  
censez41 avatarı
Yıllanmış Üye
Teşekkür Sayısı: 3
1,705 mesaj
Kayıt Tarihi:Kayıt: Nis 2009

long olarak tanımlanmış değişkenine sığmıyor olabilirmi başka bir tanımlama yapmayı denedinmi

muh34
06-03-2011, 22:12   |  #3  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

Kullanmış oldugunuz long veri tipi 4 byte'lık bir sayısal veri aralıgına sahip bir primitiftir.Dolayısıyla daha buyuk sayılar bir sure sonra 32 bitte gosterilmeyecek kadar buyuk olur.Ayrıca bu problem ister fonksiyon altında olsun,ister iteratif bir kod satırında bulunsun,ortaya cıkan sonuc aynı olacaktır.Probleminizin cozumu 8 byte'lık veri aralıgına sahip double tipidir.

Başarılar

virgo2000
07-03-2011, 01:56   |  #4  
OP Taze Üye
Teşekkür Sayısı: 0
14 mesaj
Kayıt Tarihi:Kayıt: May 2009

ilginize teşekkürler
long ile denedim olmadı yazdığım kodlar şunlar (double ı kullanamadım pro hiç çalışmadı)

/* iki bilinmeyenli üssünün açılımı*/

#include
#include
long int fakt(long int q)
    {   long int sonuc;
        sonuc = 1;
          while(q != 0)
          {   sonuc = sonuc * q;
              q = q - 1;
          }
        return sonuc;
    }
int main(int argc, char *argv[])
{


  long int a,b,xus,yus,n;   long int k;
  char x = 0170, y = 0171;
  tekrarr:
  printf("acilimini gormek istediginiz ussu giriniz\n\n\n\n");
  scanf("%d",&n);

  a = n; b = -1; xus = n; yus = 0; long int adim;

    for(adim=0;adim <= n;adim++)
    {   b = b + 1;
        k = fakt(a)/((fakt(b)) * (fakt(a - b)));

        printf(" %d(%c^%d*%c^%d) ",k,x,xus,y,yus);
        if(adim != n) printf("+");
        xus = xus - 1;
        yus = yus + 1;
    }


  printf("\n\n\n\n");
  goto tekrarr;

  system("PAUSE");
  return 0;
}

Son Düzenleme: virgo2000 ~ 07 Mart 2011 02:03
muh34
07-03-2011, 02:20   |  #5  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

/* iki bilinmeyenli üssünün açılımı*/

#include <stdio.h>
#include <stdlib.h>
double fakt(double q)
    {   double sonuc;
        sonuc = 1;
          while(q != 0)
          {   sonuc = sonuc * q;
              q = q - 1;
          }
        return sonuc;
    }
int main()
{


  double a,b,xus,yus,n;   double k;
  char x = 0170, y = 0171;
  tekrarr:
  printf("acilimini gormek istediginiz ussu giriniz\n\n\n\n");
  scanf("%lf",&n);

  a = n; b = -1.0; xus = n; yus = 0; int adim;

    for(adim=0;adim <= n;adim++)
    {   b = b + 1;
        k = fakt(a)/((fakt(b)) * (fakt(a - b)));

        printf(" %0.0lf(%c^%0.0d*%c^%0.0d) ",k,x,xus,y,yus);
        if(adim != n) printf("+");
        xus = xus - 1;
        yus = yus + 1;
    }


  printf("\n\n\n\n");
  goto tekrarr;

  system("PAUSE");
  return 0;
}
Kodun double veri tipi ile deklare edilmiş degiskenleriyle yayımlıyorum.
Başarılar

virgo2000
07-03-2011, 03:59   |  #6  
OP Taze Üye
Teşekkür Sayısı: 0
14 mesaj
Kayıt Tarihi:Kayıt: May 2009

çok teşekkürler kardeş double tipini kullanmayı öğrenmiş oldum...yardımınla faktöriyel çalıştı

Son Düzenleme: virgo2000 ~ 07 Mart 2011 04:06