求一个整数分解成连续数字的和

--学习记录

论坛问题帖:http://bbs.csdn.net/topics/390416116 

思路: 设输入数字为S; 有N个连续整数(N>1),最小整数为M(M>=1),则第二为M+1...第N个则为M+N-1(也可以改设最大数) 通过分解可拆为:S=(1+2+...+N-1)+N*M之和,再利用公式求和即为:(1+(N-1))*(N-1)/2+MN=N*(N-1)/2+MN=S N范围:N(N-1)=2S-2MN-->N平方<2S-2MN-->N<SQRT(2S-2MN) M范围:M=(2S-N(N-1))/2N

--MSSQL实现--
--支持MASTER..SPT_VALUES 表里面TYPE='P'的最大NUMBER.
CREATE FUNCTION DBO.FN_连续整数和为某值(@SUM INT)
RETURNS TABLE
AS
RETURN
(
 SELECT 
   A.NUMBER AS 连续个数,B.NUMBER AS 起始值,A.NUMBER +B.NUMBER-1 AS 结束值
 FROM 
   MASTER..SPT_VALUES A,MASTER..SPT_VALUES B
 WHERE
   A.NUMBER BETWEEN 2 AND SQRT (2*@SUM-2) AND A.TYPE='P' AND B.TYPE='P'
 AND
   B.NUMBER BETWEEN 1 AND CEILING(((2*@SUM*1.00)-A.NUMBER*(A.NUMBER-1))/(2*A.NUMBER))

 AND
   2*@SUM=A.NUMBER*(A.NUMBER-1)+2*A.NUMBER*B.NUMBER
)

-----C#实现---
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
          
            Console.WriteLine("请输入一个整数:");
            string str = Console.ReadLine();
            int y = Convert.ToInt32(str);
          
            Stopwatch sw1 = new Stopwatch();
            sw1.Start();
            PrintNum(y);
            Console.WriteLine("计算时间为:" + sw1.ElapsedMilliseconds.ToString() + "ms");
            sw1.Stop();
            Console.WriteLine();
            Console.ReadLine();
        }

        public static int MaxCount(int sum)
        {
            int n =Convert.ToInt32(Math.Ceiling( System.Math.Sqrt(Convert.ToDouble(sum*2-4))));
            return n;
        }

        public static void PrintNum(int sum)
        {
            string str = "";
            int n=MaxCount(sum);
            int tempj = 0, tempi = 0;
            for (int i = 2; i < n; i++)
            {
                int m = Convert.ToInt32(System.Math.Ceiling((Convert.ToDouble(2*sum)-i*(i-1)) / (2*i)));
                for (int j = 1; j <= m; j++)
                {
                    if (i * (i - 1) + 2 * i*j == 2 * sum)
                    {
                        tempj = j;
                        tempi = i;
                        str = "";
                    }
                }
                if (tempj > 0)
                {
                    str = "";
                    for (int k = tempj; k < tempj + i; k++)
                    {
                        str = str + k.ToString() + "+";
                    }
                    Console.WriteLine(tempi.ToString() + "个数:" + str.TrimEnd( '+') + "=" + sum.ToString());
                }
                tempj = 0; tempi = 0;
            }
            if (string.IsNullOrEmpty(str))
            {
                Console.WriteLine("没有连续数字的和等于此值");
            }
        }

    }
    
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值