2015-03-05 3 views
5

Я новичок в конкурентном программировании, и я сделал проблему с рангом Хакер. Заявление вопрос заключается в следующем:Хакер Ранг: Project Euler # 1

«Если мы все натуральные числа меньше 10, кратные 3 или 5, получим 3, 5, 6 и 9. Сумма этих мультипликаторов составляет 23.

Найти сумму всех кратные 3 или 5 ниже N.

формата входного Первой строка содержит T, которое обозначает количество тестовых случаев. за этим следует Т строки, каждые из которых содержит целое число, Н.

Формат вывода Для каждого тестового примера напечатайте целое число, которое обозначает сумму всех кратных 3 или 5 ниже N. "

Ограничения

1≤T≤10^5

1≤N≤10^9

Я написал следующий код, который успешно удовлетворяет 3 случая испытания и терпит неудачу в оставшиеся два.

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

Какая ошибка в моем коде. Почему он не принимается?

+4

Речь идет не о конкурентоспособности ... Речь идет о поиске ответа на загадку. Это может быть не полезно, но решение проблемы дает много удовлетворения. Итак, если вы действительно поможете мне найти ошибку, это будет действительно полезно. –

+1

Можете ли вы объяснить алгоритм функции func()? – jarmod

+1

@jarmod: Это вариант суммы всех натуральных чисел до 'n', являющийся' n * (n + 1)/2', только с шагом 'p'. –

ответ

1

Существует несколько вопросов.

Вы действительно переполняете свой int при возврате с func. Кроме того, ваше printf заявление должно быть printf("%llu\n", count);

Таким образом, возвращение из func, count и локальной переменной j, все должны быть unsigned long long и вашей распечатка должна отражать, что хорошо. Вы должны сделать junsigned long long из-за арифметики в операторе возврата для func (это, по крайней мере, в VS 2013).