【问题标题】:Time Limited Exceeded error C++ compileTime Limited Exceeded 错误 C++ 编译
【发布时间】:2016-07-16 10:50:31
【问题描述】:

我尝试计算 power(n,p) 并在 n 或 p codechef
中编译时出现 Time Limited Exceeded 错误 问:
1. C++什么时候出现Time Limited Exceeded错误?
2.我的代码哪里错了?

#include <cmath>
#include <iostream>
#include <exception>
#include <stdexcept>
#include <cstdio>

using namespace std;

class Calculator{
public:
    int power(int n,int p){
        if(n<0 || p < 0)
            throw "n and p should be non-negative";
        else
           return power(n,p);
    }
};

int main()
{
    Calculator myCalculator=Calculator();
    int T,n,p;
    cin>>T;
    while(T-->0){
        if(scanf("%d %d",&n,&p)==2){
            try{
                int ans=myCalculator.power(n,p);
                cout<<ans<<endl; 
            }
            catch(exception& e){
                cout<<e.what()<<endl;
            }
        }
    }
}

【问题讨论】:

  • 你有没有试过运行你的代码(即使是简单的输入)?我怀疑你没有。
  • 该错误不是 C++ 错误,而是来自该网站的错误。阅读他们的帮助材料以准确了解它的含义(但很可能您的程序运行时间太长,他们不允许这样做,并且要修复它,您必须使您的程序完成得更快,或者更有可能修复一个错误)。
  • 是的,我尝试按照输入 2 -3 5 2 4
  • 我不知道您尝试运行什么示例输入。您应该使用最简单的输入获得无限递归。这就是为什么我怀疑您在此处发布问题之前没有尝试运行和调试。
  • 请先付出一些努力。当您返回时,在您的 power() 方法中,您需要调用 pow(n,p)。

标签: c++ exception-handling


【解决方案1】:

这是因为您的代码中有无限递归。

看这里:

int power(int n,int p){
    if(n<0 || p < 0)
        throw "n and p should be non-negative";
    else
       return power(n,p);
}

它会无限次调用power(n, p),因为你没有条件退出执行。因此,您只需将一个函数调用一个接一个地放在堆栈上。你甚至不做任何计算!

你需要这样的退出条件:

int power(int n,int p){
    if(n<0 || p < 0)
        throw "n and p should be non-negative";
    else if (p == 0)
    {
        return 1;
    }
    return n*power(n,p-1);
}

【讨论】:

    【解决方案2】:

    Calculator::power 是无限递归的:它使用接收到的相同参数调用自身。那里肯定应该有乘法某处... ;-]

    【讨论】:

    • @Nidhoegger :我确实给出了一个想法:使用与收到的不同的参数。 SO 不是代码编写服务,OP 也没有要求修复代码——他们只是想知道问题所在。
    • 当然不是。我在那里和你在一起。但是正如你所看到的,他的英语不是那么好,你可以暗示他需要/想要什么。就像我说的,你不必为他解决问题,但让他对递归的工作原理有一个模糊的概念......
    【解决方案3】:

    超过时间限制是在一定时间后没有生成输出时的错误,在你的情况下,你有一个无限递归,你称之为 power(a, b) 如果 a > 0 && b > 0 那么你调用 power(a,b) 所以你进入一个无限递归 试试添加这个

    int power(int n, int p){ if(n<0 || p < 0) throw "n and p should be non-negative";
    else if (p == 1) return 1;
    else return n*(n,p-1);}
    

    【讨论】:

      【解决方案4】:

      您的代码几乎是正确的。只是一个小案子处理不当。在计算数字的幂时,您再次使用相同的参数递归地调用了相同的函数。此处未提供基本案例,因此您的函数不知道何时停止。你可以做一些这样的改变:

      在函数中使用基本情况: 如果 (p == 0) 返回 1;

      并以递减的幂递归调用您的函数: 返回(n*(幂(n,p-1)));

      你的问题会很容易解决的。

      【讨论】:

        猜你喜欢
        • 2020-05-21
        • 2022-01-20
        • 2017-01-13
        • 2021-08-08
        • 2015-12-04
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        相关资源
        最近更新 更多