• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
彭旭
天空不留痕迹,鸟儿却已飞过……
博客园    首页    新随笔    联系   管理    订阅  订阅

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

前言

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

 

知识共享许可协议
本文 由 彭旭 创作,采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
posted @ 2010-05-12 15:31  彭旭  阅读(368)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3