2015-12-25 3 views
-4

Я пытался реализовать эту проблему из SPOJ: http://www.spoj.com/problems/COINS/ используя memoization, но я продолжаю получать Runtime error и не могу понять почему. Вот мой код:Ошибка выполнения в моем коде

#include<stdio.h> 
long long int max(long long int a,long long int b) 
{ 
    if(a >= b) 
     return a; 
    else 
     return b; 
} 
long long int dp[100000]; 
long long solve(long long int n) 
{ 
    long long ans; 
    if(n<=50000) 
     return dp[n]; 
    else 
     ans=(n,solve(n/2)+solve(n/3)+solve(n/4)); 
     return ans; 

} 
int main() 
{ 
    long long int n; 
    int t; 

    for(int i = 0;i <=50000;i++) 
    { 
     dp[i] = max(i,dp[i/2] + dp[i/3] + dp[i/4]); 
    } 

    while((scanf("%d",&t))>0) 
     printf("%lld",solve(n)); 
    return 0; 
} 
+1

Вы пытались отлаживать свой код с помощью отладчика, такого как gdb? –

+0

согласно задаче, максимальное значение ** t ** составляет 1,000,000,000, что больше максимального диапазона int. попробуйте ** long ** вместо ** int ** для ** t **. –

+0

@MahediSabuj не на 32-битной системе. Даже подписанный 32-битный int может обрабатывать величины, превышающие 2 000 000 000. Подсказка: что такое 2 ** 31? –

ответ

1

Вот несколько проблем:

  1. В solve, у вас есть ans = (n,solve(n/2)...); Ведущее n не имеет никакого эффекта. Вы предполагали, что это список аргументов max? Если это так, вам нужно добавить max. В противном случае это просто выражение для запятой, и вы также можете удалить ведущий n.

  2. У вас возникли проблемы с инициализацией dp. Рассмотрим первый проход через цикл, когда i равно 0. В этом случае i/2 и т. Д. Также будут равны нулю, поэтому значения dp не будут определены. Попробуйте установить dp[0] явно, вне цикла, а затем запустите свой цикл с индексом 1.

  3. При печати решения в main вы, вероятно, захотите добавить newling \n в конец строки формата printf.

  4. Как уже отмечалось другими, при вызове solve из main, вы передаете n, а не t.

1

Проблема, скорее всего, из-за этого:

while((scanf("%d",&t))>0) 
     printf("%lld",solve(n)); 

Вы читаете t, но проходя n, который неинициализированным. Вы, вероятно, хотите передать t в solve():

while((scanf("%d",&t))>0) 
     printf("%lld",solve(t)); 
1

Причина вы получите Runtime Ошибка

while((scanf("%d",&t))>0) 
    printf("%lld",solve(n)); 

Здесь Вы получаете вход в переменной t но передать переменную n в solve функцию. Используйте переменную t или n для обоих случаев. Это решит вашу проблему.

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