杭电oj1000(c++)

题目分析

Problem Description

Calculate A + B.

Input

Each line will contain two integers A and B. Process to end of file.

Output

For each case, output A + B in one line.

这是一道简单的题目,输入两个数字并输出相加结果。值得一提的是"process to end of life"和"for each case"向我们提示了题目要求的是一个循环过程,截止条件为EOF。

代码

#include 
using namespace std;
int main()
{
	int a, b;
	while(cin >> a >> b)
	cout << a + b << endl;
	return 0;
}

超时问题(Time Limit Exceeded)

以下内容转载自 https://blog.csdn.net/MTOY_320/article/details/78363375

在oj中,给定的Time Limit 是1000MS,出现Time Limit Exceeded则说明这个程序的运行时间超过了这个限度。

经过几道题,我猜想了几个关于超时的原因:

1.没有循环终止条件。

就是说程序中存在一个循环,但是这个循环没有终止条件,或者说是条件太宽泛,在运行的时候虽然能输出结果,但这个循环会一直循环下去,导致运行时间过长。

例如:

在1001中,要测试多组数据,进行多次循环,

如果这样写

for(m=0;m>0;m++)

scanf(…)

企图让输入一直循环,理论上并没有什么问题,程序也能运行正确,但却会超时。

因为没有一个终止的条件,计算机会一直不断去运行,m只会无限大,这是实际一种很无赖的做法。

而如果要想用一个合理的方式实现无限次循环,就需要用

while(scanf()!=EOF)

这里虽然也可无限次的循环,却有了终止条件:返回值为-1 的时候

关于while(scanf()!=EOF)的用法原理,

我再网上查阅得到:

scanf("%d,%d", &a, &b)中

如果a和b都被成功读入,那么scanf的返回值就是2

如果只有a被成功读入,返回值为1

如果a和b都未被成功读入,返回值为0
 如果遇到错误或遇到end of file,返回值为EOF。

笔者注 在c++语言中可以用while(cin>>a)语句来实现。

2.函数调用超时。

例如:

在1279中,需要用到一个n的阶乘。

在第一次做的时候,我调用了一个递归函数来求阶乘,运行测试正确,却出现了超时情况。

然后换了一种做法,用一个for循环去求阶乘,结果就通过了。

我上网查询得到,递归调用因为经常会调用自身很多次,所以时间的复杂度是指数级别的。

3.程序算法不够优化。

就是说自己的程序太复杂,存在更快更有效率的方法。

所以在解决问题时,应尽量选择简单的算法。

如果遇到了这种情况,只能换一个思路了。

4.程序本身存在问题。

你可能感兴趣的:(杭电oj1000(c++))