2015-03-05 20 views
5

Tôi mới tham gia chương trình cạnh tranh và tôi đã gặp vấn đề với Xếp hạng Hacker. Những tuyên bố câu hỏi như sau:Hacker Xếp hạng: Dự án Euler # 1

"Nếu chúng ta liệt kê tất cả các số tự nhiên xuống dưới 10 mà là bội số của 3 hoặc 5, chúng tôi nhận được 3, 5, 6 và 9. Các tổng của các bội số là 23.

Tìm tổng của tất cả các bội số của 3 hoặc 5 dưới đây N.

Input Format dòng đầu chứa T mà biểu thị số trường hợp thử nghiệm. tiếp theo là dòng T, mỗi có chứa một số nguyên, N.

Định dạng đầu ra Đối với mỗi trường hợp kiểm tra, in một số nguyên biểu thị tổng của tất cả bội số của 3 hoặc 5 dưới N. "

chế

1≤T≤10^5

1≤N≤10^9

Tôi đã viết đoạn mã sau đó đáp ứng thành công 3 trường hợp thử nghiệm và thất bại tại còn lại hai.

#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; 
} 

Lỗi trong mã của tôi là gì. Tại sao nó không được chấp nhận?

+4

Nó không phải về khả năng cạnh tranh ... Đó là về việc tìm câu trả lời cho một câu đố. Nó có thể không hữu ích nhưng giải quyết vấn đề cho rất nhiều sự hài lòng. Vì vậy, nếu bạn thực sự có thể giúp tôi trong việc tìm ra sai lầm, điều đó sẽ thực sự hữu ích. –

+1

Bạn có thể giải thích thuật toán đằng sau hàm func() không? – jarmod

+1

@jarmod: Đó là một biến thể của tổng của tất cả các số tự nhiên lên đến 'n' là' n * (n + 1)/2', chỉ với bước 'p'. –

Trả lời

1

Có một số vấn đề.

Bạn đang thực sự tràn số int khi trở về từ func. Ngoài ra, tuyên bố printf của bạn nên được printf("%llu\n", count);

Vì vậy, sự trở lại từ func, count, và các địa phương biến j, tất cả nên được unsigned long long và bản in của bạn nên phản ánh điều đó là tốt. Bạn cần phải thực hiện junsigned long long do số học trong báo cáo trả về cho func (ít nhất là trong trường hợp này trong VS 2013).

Các vấn đề liên quan