J

You just need to calculate the sum of the formula: 1^2+3^2+5^2+……+ n ^2.

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 ", 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 ", 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