2016-03-25 16 views
-4

Tamam, bu from Codechef yapmaya çalıştığım kolay bir soru için kod. Soru basitti ama bir sebepten dolayı büyük bir girdi kullanırken yanlış bir cevap alıyorum, fakat küçük bir girdi için doğru olanları.Büyük bir giriş kullanırken yanlış çıktı

Ben houses10 ve k2, ben doğru miktarda alıyorum ama aynı evler tutmak ve k=10 kullandığımda yanlış cevap alacağı atamak Örnek.

Kodum

#include<stdio.h> 
#include<math.h> 

int main(){ 

    int houses[1000],k,numberofhouses; 
    int sum=0,tmpsum=0; 
    int i,j,d; 

// printf("enter number of houses\n"); 
    scanf("%d",&numberofhouses); 

// printf("enter k\n"); 
    scanf("%d",&k); 

// printf("enter distance\n"); 

    for(i=0;i<numberofhouses;i++) { 
     scanf("%d",&houses[i]); 
    } 

    for(i=0;i<(numberofhouses-1);i++) { 
     for(j=i+1;j<numberofhouses;j++) { 
      d = (houses[i] - houses[j]); 
      tmpsum = pow(abs(d),k); 
      sum = sum + 2 * tmpsum; 
     } 
    } 

    printf("sum is %d",sum); 
    return 0; 


} 
+6

Java, C veya C++? C gibi görünüyor. Bu yüzden etiketlerinizi ayarlayın. – pzaenger

+0

int biliyor genellikle 32 bit ve ~ 2kkk etrafında maksimum değer nedir? –

+1

Sorun, sonuca, sizin için bir ipucu olabilecek, ancak bahsetmeyi veya uygulamayı ihmal ettiğiniz modulo 1000000007 verilmelidir. Geçici konumunuzu aşmaktan veya hassasiyeti kaybetmekten kaçınmak için [modüler üslenme] (https://en.wikipedia.org/wiki/Modular_exponentiation) 'ı arıyoruz. –

cevap

0

büyük girişini kullanarak nedeniyle taşma, tmpsum= pow(abs(d),k); çizgidir yanlış çıktıya temel nedeni.

Daha büyük değerler için pow(a,b) sonucu int veri türüdür.

Veri tipinizi long long int olarak değiştirmeyi deneyin.

long long int bile sizin için çalışmaz. Kendi pow fonksiyonunuzu uygulamanız gerekiyor.

long long int mypow(int a,int b) { 
    if(b == 0) 
     return 1; 
    if(b == 1) 
     return a; 
    if(b%2) 
     return (((a*mypow(a*a,b/2)))%(1000000007)); 
    return((mypow(a*a,b/2))%(1000000007)); 
} 
+0

Ara sonuçların bir “int” için çok büyük olabileceği konusunda haklısınız. Ne yazık ki, onlar da uzun uzun int için çok büyük olabilir. –

+0

@JohnBollinger: Haklısınız. Ama söz konusu bağlantıyı gördüm. 'D' maksimum değeri '10^5' olabilir ve 'k' 100' olabilir '' uzun uzun int' gerekli değerleri saklamak için yeterli değildir. Her adımda '% 'alabileceği kendi' pow() işlevini uygulamalıdır. Pow (a, b) 'O (log (b))' da uygulanabilir. – Shravan40

+0

@ Shravan40 Bu kütüphane işlevini aldığımda pow burada benim için çalışmıyorum, bu yüzden basit özyineleme kullanarak kendi güç işlevlerimi uyguladım ama yine de yanlış çıktı alıyorum. ve ayrıca mypow fonksiyonunun nasıl çalıştığını bana söyleyebilirsin. Üç temel fonksiyonun önemini ve b% 2'yi kullanmıyorum. yardımın için teşekkürler. –

İlgili konular