2015-03-05 16 views
5

Rekabetçi programlamaya yeni çıkıyorum ve Hacker Rank konusunda bir sorunla karşılaştım. şöyle bir soru ifadesi:Hacker Derece: Project Euler # 1

"Biz 3 veya 5 katı olan 10'un altındaki tüm doğal sayılar listesi, biz 3, 5, bu katları 6 ve 9. toplamı 23.

olduğunu olsun

N. ilk hat test vakalarının sayısını belirtmektedir T içeren

Giriş Biçimi aşağıdaki 3 veya 5 tüm katları toplamını bulmak. Bu, N.

her biri bir tam sayı içeren T hatları izlemektedir

Çıkış Biçimi Her bir test durumu için, tüm katların toplamını gösteren bir tamsayı yazdırın. N altında 3 veya 5

Kısıtlamalar

1≤T≤10^5

1≤N≤10^9 başarıyla 3 test durumları karşılar ve kalan iki başarısız aşağıdaki kodu yazdım

.

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

int func(int p,int n) 
{ 
    int j; 
    n=n-1; 
    j=n/p; 
    return (p*j*(j+1))/2; 
} 

int main() 
{ 
    unsigned long int n; 
    int t,j,count; 
    scanf("%d",&t); 
    if(t>=1 && t<=100000){ 
     for(j=0;j<t;j++) 
     { 
      scanf("%lu",&n); 
     if(n>=1 && n<=1000000000) 
     { 
       count=func(3,n)+func(5,n)-func(15,n); 
       printf("%d\n",count); 
      } 

     }} 
    return 0; 
} 

Kodumdaki hata nedir? Neden kabul edilmiyor?

+4

Bu rekabetle ilgili değil ... Bir bulmacanın cevabını bulmakla ilgili. Kullanışlı olmayabilir, ancak problemi çözmek çok tatmin edici sonuçlar verir. Yani, eğer insanlar hatayı bulmama yardım edebilirlerse, bu gerçekten yardımcı olur. –

+1

Func() 'nin arkasındaki algoritmayı açıklar mısınız? – jarmod

+1

@jarmod: 'n' (n + 1)/2 'ye kadar olan tüm doğal sayıların toplamı, sadece' p 'adımıyla. –

cevap

1

Birkaç sorun var.

func'dan döndüğünüzde, int numaralı telefonunuzu taşıyorsunuz. Ayrıca, printf deyimi bütün yanı bunu yansıtmalıdır unsigned long long ve baskı dışarı olmalıdır printf("%llu\n", count);

Yani

, func, count dönüş ve yerel değişken j olmalıdır. func için döndürme ifadesindeki aritmetik nedeniyle (bu en az VS 2013'te geçerlidir) junsigned long long yapmalısınız.