将自然数分解为若干连续的自然数

前言

例如,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();
}
原文地址:https://www.cnblogs.com/ainijiutian/p/1733738.html