【问题标题】:Runtime error in my code我的代码中的运行时错误
【发布时间】:2016-03-31 13:19:14
【问题描述】:

我试图从 SPOJ:http://www.spoj.com/problems/COINS/ 使用 memoization 解决这个问题,但我不断收到运行时错误,无法弄清楚原因。这是我的代码:

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

【问题讨论】:

  • 您是否尝试使用调试器(如 gdb)调试您的代码?
  • 根据问题,t 的最大值为 1,000,000,000,大于 int 的最大范围。为 t 尝试 long 而不是 int
  • @MahediSabuj 不在 32 位系统上。即使是带符号的 32 位 int 也可以处理大于 2,000,000,000 的量级。提示:什么是 2**31?
  • 据我所知,在 c 中,int 2^15-1 和 long 2^31-1 的最大范围,不是吗? @TomKarzes
  • @MahediSabuj 通常这仅适用于 16 位系统。我猜 OP 在 32 位或 64 位系统上运行。 C 没有定义范围(它只给出最低要求的范围)。你为什么不自己试试呢?尝试查看sizeof(int)。如果它是 4(或更大),那么它应该能够处理 +/- 20 亿。

标签: c dynamic-programming memoization


【解决方案1】:

您收到运行时错误

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

在这里,您在变量 t 中获得输入,但将变量 n 传递给 solve 函数。两种情况都使用变量tn。它会解决你的问题。

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1. solve 中,您有ans = (n,solve(n/2)...); 前导n 无效。您是否打算将其作为max 的参数列表?如果是这样,您需要添加max。否则它只是一个逗号表达式,你不妨删除领先的n

    2. main中,你对dp的初始化有问题。考虑第一次循环,当 i 为 0 时。在这种情况下,i/2 等也将为零,因此那些 dp 值将未定义。尝试在循环外显式设置dp[0],然后在索引1 处开始循环。

    3. main 中打印解决方案时,您可能希望将newling \n 添加到printf 格式字符串的末尾。

    4. 正如其他人所指出的,当从main 调用solve 时,您传递的是n 而不是t

    【讨论】:

      【解决方案3】:

      问题很可能是由于以下原因:

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

      您正在阅读t,但传递了未初始化的n。您可能想将t 传递给solve()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 2023-02-19
        相关资源
        最近更新 更多