前言
例如,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();
}