2016-04-07 16 views
-1

Bu programla neden bir segmentasyon hatası (SIGSEGV) alıyorum.Faktöriyel hata bulmada bölümlendirme hatası

100, 200 gibi çok sayıdaki faktörleri bulmaya çalışıyorum ama neden bazı durumlarda bölümleme hatası olduğunu bilmiyorum. Bana yardım et.

Kısıtlayıcı:

  • 1 ≤ T ≤ 'a dizi 5000 elemanları içerebilir, ancak don 100000
  • 1 ≤ N 100000
#include<stdio.h> 
int main() 
{ 
    long long int t,mod=1589540031; 
    long long int a[5000]; 
    long long int n,i,j,temp,k,x; 

    scanf("%lld",&t); 
    while(t--) 
    { 
     scanf("%lld",&n); 
     a[0]=1; 
     k=1;  

     temp = 0; 
     for(i=1;i<=n;i++) 
     { 
      for(j=0;j<k;j++) 
      { 
       x = a[j]*i+temp; 
       a[j]=x%10; 
       temp = x/10; 
      } 
      while(temp>0) 
      { 
       a[k]=temp%10; 
       temp = temp/10; 
       k++; 
      } 
     } 
     for(i=k-1;i>=0;i--) 
      printf("%lld",a[i]%mod); 
      printf("\n"); 
    } 
    return 0; 
} 
+1

Hangi giriş için segfault'ları tam olarak alıyorsunuz? Bu bilgi sorunun bir parçası olmalı. –

+0

Kodunuzu düzgün bir şekilde girebilir misiniz? – hivert

+1

Orijinal ödeve bağlantı vermiyorsunuz, ancak _n! _ Modulo _m_ değerini hesaplamanız gerekiyormuş gibi görünüyor. Eğer öyleyse, çarpmayı bir dizi ile yapmanız gerekmez. Sadece boyunca [modüler aritmetik] (https://en.wikipedia.org/wiki/Modular_arithmetic) kullanın. (0 ile 9 arasında olan rakamları yazdırırken kalan kısmı almak anlamsızdır.) –

cevap

1

≤ t k ve j'un 5000'den büyük olup olmadığını kontrol edin.

Dizini> 5000 olan dizinin a dizisine erişmeye çalıştığınızda, tanımlanmamış bir davranış alırsınız.

for(j=0;j<k;j++) 
{ 
    x = a[j]*i+temp; // <<<<< j could be > 5000 
    a[j]=x%10; 
    temp = x/10; 
} 

while(temp>0) 
{ 
    a[k]=temp%10;  // <<<<< k could be > 5000 
    temp = temp/10; 
    k++; 
} 
... 
+1

100000! yaklaşık 10 kat fazla 5000 basamak var. Her dizi adımında modülü uyguladığınızı görüyorum. Bu oldukça yanlış. Muhtemelen (bu "meydan okuma" sorusunun kokusu), ürünü uint64_t "aralığında tutmak için her çarpmada modülü uygulamak gerekiyor. İmzalı kullanmayın. Modülün, kare bitin 64 bit olarak tutulduğu, yani ürünün daima menzilde yer alması gereken "1589540031" olduğunu görüyorum. –

+0

sonra bu sorunu nasıl çözebilirim? –

+0

I ve @MOehm size nasıl olduğunu anlattı. Ama ben soruyu görmedim. Eğer çevrimiçi bir meydan okuma ise, kendiniz anlamayasınız! –

İlgili konular