InputIn each case, there is an odd positive integer n.OutputPrint the sum. Make sure the sum will not exceed 2^31-1Sample Input
3
Sample Output
10
代码如下: (不过还是建议大家看看下面的错误代码和思路)
#include<stdio.h>
int main()
{
int p[2344] = {0}; 之所以为2344;是因为后面的值都超出额这个范围。注意:建议大家还是把各个数据类型的范围多记忆,然后培养范围管控的素养
p[1] = 1;
for (int i = 3; i < 2344; i += 2) 打表将数值直接放入数组中,在检测时,就拿出即可。
{
p[i] = i*i + p[i - 2];
}
int n;
while (scanf("%d", &n)!=EOF)
{
printf("%d\n", p[n]);
}
return 0;
}
直接用数学方法:(不能ac的代码)
#include<stdio.h>
int main()
{
int n;
int ans;
while (scanf("%d",&n))
{
ans = (n*n*n + 3 * n*n + 2 * n) / 6;
printf("%d\n", ans);
}
return 0;
}
这段代码最重要的是求出1^2+3^2+5^2+……+ n ^2.的表达式,其基本方法是高中学到的一个知识点: T奇数项+T偶数项;与T奇数项-T偶数项;
用这样的方法求出表达式:(n*n*n + 3 * n*n + 2 * n) / 6;
但是在实际中,为什么这段代码用时比较长呢?这段代码,在什么情况下,比较好呢?
1. 之所以时间长是因为比如一检测1000个数据的范围,那么第一段代码计算1000多次。而在第二段代码中,在那个表达式中却是3000多次。这样估算时间。
一定是在大量数据的时候超时的。
2.那么这段代码,比较好的地方在与,我们的实际数据范围不大的时候。毕竟,我们不像第一段代码把不必要的数据都算出.
总结:打表的方法,更加适合数据的数量比较大,而且题中的题意更多与数列有关的题。
当然,这种题意也很大可能用递归实现。但是注意递归时的内存问题。
原文:https://www.cnblogs.com/damaoranran/p/8748127.html