2016-03-25 2 views
-4

Хорошо, это код для простого вопроса, который я пытался сделать from Codechef. Вопрос был прост, но по какой-то причине я получаю неправильный ответ при использовании большого ввода, но правильный для небольшого ввода.Неверный вывод при использовании большого ввода

Пример

Когда я задаю houses к 10 и k к 2, я получаю правильное количество, но когда держать дома то же самое и использовать k=10 Я бы получить неправильный ответ.

Мой код

#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 или C++? Кажется, это C. Так что настройте теги. – pzaenger

+0

вы знаете, что int обычно 32 бит и максимальное значение около ~ 2kkk? –

+1

Проблема указывает, что результат должен быть указан по модулю 1000000007, что могло бы быть ключом к вам, но которое вы пренебрегаете упоминанием или реализацией. Вы ищете [модульное усиление] (https://en.wikipedia.org/wiki/Modular_exponentiation), чтобы избежать переполнения ваших временных рядов или потери точности. –

ответ

0

Основной причиной неправильного выводе при использовании большого вклада является tmpsum= pow(abs(d),k); линии, из-за переполнения.

Для больших значений результат pow(a,b) больше, чем у int данных.

Попробуйте изменить тип данных на long long int.

Поскольку даже long long int не подходит для вас. Вам нужно реализовать свою собственную функцию pow.

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

Вы правы, что промежуточные результаты могут быть слишком большими для 'int'. К сожалению, они могут быть слишком большими для 'long long int'. –

+0

@JohnBollinger: Вы правы. Но я видел ссылку, о которой идет речь. Максимальное значение 'd' может быть' 10^5' и 'k' может быть' 100', '' long long int' недостаточно для хранения требуемых значений. Ему нужно реализовать свою собственную функцию 'pow()', в которой он может принимать '%' на каждом шаге. 'Pow (a, b)' может быть реализовано в 'O (log (b))'. – Shravan40

+0

@ Shravan40 Я получаю, что библиотечная функция pow не будет работать для меня здесь, поэтому я реализовал свою собственную функцию pow, используя простую рекурсию, но все же получаю неправильный вывод. а также можете рассказать мне, как работает ваша функция mypow. я не получаю значение трех базовых функций и использования b% 2. спасибо за помощь. –

Смежные вопросы