zoukankan      html  css  js  c++  java
  • 将自然数分解为若干连续的自然数

    前言

    例如,500可以分解为一下几种:

    500

    98,99,100,101,102

    59,60,61,62,63,64,65,66

    8,9,10,11,12,13,14,15,16,17,............,31,32

    准备

    1.最多可以分解为多少个连续的自然数,即 n。

      可以假设 500 = n2,则,n = sqrt(500),n取整加1即为最多组数。此处可仔细想想。

    2.分析在什么情况下可分解

      分析可知:

      n     取模     正解     结果

      1       0         0       500

      2   0         1        

      3   2      0

      4   0    2

      5   0    0    98,99,100,101,102

      6   2      3

      7   3    0    

      8   4    4        59,60,61,62,63,64,65,66

      ......................................................

      此处“正解”为当取模与此相同时才能分解。具体结果由 1,2,3,4,5,6,7,8 这几个连续自然数推出来的。

      由此可以看出:当连续自然数个数为奇数并且取模为 0 时,或者,为偶数时并且取模为偶数的一半时有解

    正文

    /// <summary>
    /// 将自然数分解为若干连续的自然数
    /// </summary>
    /// <param name="n">自然数</param>
    /// <returns></returns>
    public string Decompose(int n)
    {
    StringBuilder sb
    = new StringBuilder();
    if (n < 0) sb.Append(n.ToString() + " 不是自然数") ;
    int length = (int)Math.Sqrt((double)n * 2) + 1;
    for (int i = 1; i < length; i++)
    {
    if (i % 2 == 1 && n % i == 0)// i 为奇数,n 能被 i 整除
    {
    for (int j = n / i - i / 2; j <= n / i + i / 2; j++)
    {
    sb.Append(j);
    if (j != n / i + i / 2) sb.Append(",");
    }
    sb.Append(
    "\n");
    }
    if (i % 2 == 0 && n % i == i / 2)// i 为偶数,n 除以 i 余 i / 2
    {
    for (int j = n / i - i / 2 + 1; j <= n / i + i / 2; j++)
    {
    sb.Append(j);
    if (j != n / i + i / 2) sb.Append(",");
    }
    sb.Append(
    "\n");
    }
    }
    return sb.ToString();
    }
  • 相关阅读:
    Nginx日志切割
    Spring Cloud Alibaba基础教程:Nacos+Dubbo
    Spring Cloud Alibaba基础教程:Sentinel
    Gogs+Drone搭建CI/CD平台
    Spring事件机制
    OpenGL 安装
    Melkman's Algorithm
    Tools: python 安装
    Tools: windbg 使用指南
    Tools: java安装指南
  • 原文地址:https://www.cnblogs.com/ainijiutian/p/1733738.html
Copyright © 2011-2022 走看看