zoukankan      html  css  js  c++  java
  • 对于一个给定的正整数 n ,请你找出一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。

    转自:https://blog.csdn.net/enjoying_science/article/details/50357303

    设等差数列:
    an=a+(n-1)*d (这里首项为a,公差d=1,第n项为an,前n项和为sn)
    a1=a
    an=a+n-1
    sn=(a1+an)n/2=(2a-1+n)*n/2
    再回到这个编程上来:
    我们的输入数据其实就是sn,需要找到以a开始的n个连续的递增数列使得和为sn。
    这里我们可以用循环来判定,给定一个n,sn已知,就可以求出a,如果a为正整数那么就可以找到等差数列的首项,加上n给定,d=1,那么就可以写出这个和式子。

    进一步优化提高程序效率:这里的n无须一直从2开始枚举下去,可以由sn=(2a-1+n)*n/2,所以a=sn/n-n/2+1/2,该式子为递减函数,n越大,a越小,而a最小为1,故另a=1时可确定n的最大范围。

    令a=1,得二元一次方程(1/2+n/2)*n=sn,即n^2+n-2*sn=0,可得方程两个根中取较大的根n=0.5*(-1+sqrt(1+8*sn)),从而确定n的最大枚举范围。

  • 相关阅读:
    makefile文件编写
    soem函数库的编译
    加秘钥的SSH
    ssh传文件
    ssh1
    安装paramiko的方法
    Ftp客户端(上传文件)
    ftp服务端
    vi编辑器没有颜色的解决办法
    socket服务器
  • 原文地址:https://www.cnblogs.com/bao-ZhangJiao/p/14268789.html
Copyright © 2011-2022 走看看