• 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.那么这段代码,比较好的地方在与,我们的实际数据范围不大的时候。毕竟,我们不像第一段代码把不必要的数据都算出.

    总结:打表的方法,更加适合数据的数量比较大,而且题中的题意更多与数列有关的题。
        当然,这种题意也很大可能用递归实现。但是注意递归时的内存问题。
  • 相关阅读:
    天真
    投机取巧——Label控件变Line控件
    忽然想起当年我做水泥工的日子
    欢迎来到 wwh 的博客!
    Jenkins配置
    nginx启动停止脚本
    youget下载视频
    git同步代码
    Vue(26)eltree树形控件实现鼠标hover显示与隐藏
    Vue(27)vuecodemirror实现在线代码编译器
  • 原文地址:https://www.cnblogs.com/damaoranran/p/8748127.html
Copyright © 2020-2023  润新知