算法题

lizhengnan 2010-11-04 05:04:32
对于给定的一个数字正整数N,是否存在有几个连续数字相加等于N.
如:
1+2=3
4+5=9
2+3+4=9

1.给定一个数字,求出所有满足以上条件的表达式.
2.什么样的数字一定不存在以上的的情况?
3.N最多可以是几个连续数字相加的和?

(这是<编程之美>上的一道题)
以下是我写的,不知道是否正确,大家看一下吧.
1.

public class ComputeH
{
public static void Compute(int x)
{
int cnt = (int)System.Math.Ceiling(((System.Math.Sqrt(8 * x + 1) - 1) / 2));

for (int i = 2; i <= cnt; i++)
{
if (i == 2 && x % 2 != 0)
{
Console.WriteLine((x / 2) + "+" + ((int)System.Math.Ceiling((double)x / 2)) + "=" + x);
}
else if (i % 2 != 0 && x % i == 0)
{
print1(x, i);
}
else if (i % 2 == 0 && x % i == i / 2)
{
print2(x, i);
}
}
}

private static void print1(int x,int i)
{
int[] tmp = new int[i];

for (int j = 0; j < i; j++)
{
tmp[j] = x / i;
}

for (int j = 0; j < (i / 2); j++)
{
tmp[j]-=(i/2-j);
tmp[i-j-1] += (i/2 - j);
}

printArray(tmp, x);
}

private static void print2(int x, int i)
{
int[] tmp = new int[i];

for (int j = 0; j < i; j++)
{
tmp[j] = x / i;
}
tmp[i - 1] += x % i;

for (int j = i-2; j >= 1; j--)
{
int t = tmp[j];
tmp[j] += (tmp[j + 1] - 1 - t);
tmp[j - 1] -= (tmp[j + 1] - 1 - t);
}

printArray(tmp, x);
}

private static void printArray(int[] array,int x)
{
for (int j = 0; j < array.Length - 1; j++)
{
Console.Write(array[j] + "+");
}

Console.WriteLine(array[array.Length - 1] + "=" + x);
}
}


2.当N=2^x的时候,一定有满足的表达式.至于原因我说不太清楚.我想的是
N=2^x=2*2^(x-1)
因为2本身就没有能满足以上条件的表达式,所以2*2^(x-1)也不会满足.

3.第三个问题可以用∑来求.也就是1到x的和等于N.,推理公式为:
x*(x+1)/2=N
x=(sqrt(8*N+1)-1)/2
也就是N最多可以由x项结成.


...全文
227 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teng_s2000 2010-11-07
  • 打赏
  • 举报
回复
Baggio_IT 2010-11-07
  • 打赏
  • 举报
回复
怎么把我的回复删除了
aofengdaxia 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 litaoye 的回复:]
如果一个数k能够写成若干个连续数的和,比如i+...+j,那么可以列一个求和公式,(1+2+....j) - (1+2+...i-1) = k,根据求和公式,j*(j+1) / 2 - (i-1)*i /2 = k => j^2 + j - i^2 + i = 2k 变化一下,(j^2 - i^2) + j + i = 2k => (j + i)(j - i) + (j + i) = 2k => ……
[/Quote]
方法不错
tianyueWindbg 2010-11-05
  • 打赏
  • 举报
回复
第二个问题,好似只要能被3整除或除4余2的偶数都可以,其它的偶数好似就不行了.
lizhengnan 2010-11-05
  • 打赏
  • 举报
回复
我觉的还是的规律的.

如果N分为X(X为奇数)个连接的数相加,满足N%X=0,则N必可分为X个连续的数相加.

如果N分为X(X为偶数)个连接的数相加.满足N%X=X/2的话,则N必可分为X个连续的数相加.且X个连续个数中最大的一项为N/X+N%X


whycom 2010-11-05
  • 打赏
  • 举报
回复
上边有些错
(k+1)N+(1+K)*K/2
whycom 2010-11-05
  • 打赏
  • 举报
回复
连续数相加
N+(N+1)+....+(N+k)=(k-1)*N*(1+k)*k/2
大概意思如此
直接循环解方程可以得出解
浪子-无悔 2010-11-05
  • 打赏
  • 举报
回复
算术真的是个好东西哈!!!看来又必要找个时间研究下了。
lizhengnan 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 litaoye 的回复:]

如果一个数k能够写成若干个连续数的和,比如i+...+j,那么可以列一个求和公式,(1+2+....j) - (1+2+...i-1) = k,根据求和公式,j*(j+1) / 2 - (i-1)*i /2 = k => j^2 + j - i^2 + i = 2k 变化一下,(j^2 - i^2) + j + i = 2k => (j + i)(j - i) + (j + i) = 2k =>……
[/Quote]

恩,是个好方法呀.
通过求出j的范围,然后带入方程求i.

那j的最大值应该是什么呢.n/2吗?
franchbach 2010-11-05
  • 打赏
  • 举报
回复
不错,学习一下。
绿色夹克衫 2010-11-05
  • 打赏
  • 举报
回复
直接对待求的数k*2的约数,比如k = 9,2*k = 18

18 = 1 * 18
18 = 2 * 9
18 = 3 * 6

那么每一种不同的分解,都有可能对应一组解(去掉解不是整数的情况)

(j+i)(j-i+1) = 18
设 j + i = 18, j - i + 1 = 1 => j = 9, i = 9(只有1个数,舍去)
设 j + i = 9, j - i + 1 = 2 => j = 5, i = 4(解 4+5 = 9)
设 j + i = 6, j - i + 1 = 3 => j = 4, i = 2(解 2+3+4 = 9)

[Quote=引用 8 楼 lizhengnan 的回复:]

引用 5 楼 litaoye 的回复:

如果一个数k能够写成若干个连续数的和,比如i+...+j,那么可以列一个求和公式,(1+2+....j) - (1+2+...i-1) = k,根据求和公式,j*(j+1) / 2 - (i-1)*i /2 = k => j^2 + j - i^2 + i = 2k 变化一下,(j^2 - i^2) + j + i = 2k => (j + i)(j……
[/Quote]
EastonSoft 2010-11-04
  • 打赏
  • 举报
回复
用穷举算法貌似可以,解方程。X+Y=N。这样貌似可以吧?
绿色夹克衫 2010-11-04
  • 打赏
  • 举报
回复
如果一个数k能够写成若干个连续数的和,比如i+...+j,那么可以列一个求和公式,(1+2+....j) - (1+2+...i-1) = k,根据求和公式,j*(j+1) / 2 - (i-1)*i /2 = k => j^2 + j - i^2 + i = 2k 变化一下,(j^2 - i^2) + j + i = 2k => (j + i)(j - i) + (j + i) = 2k => (j+i)(j-i+1) = 2k

因此只要对2k做因式分解,就可以求出j和i
LorenLiu 2010-11-04
  • 打赏
  • 举报
回复
对于第二个问题,有两种连续数字
1. m-n, ... m-1, m, m+1, ... ,m+n 奇数个连续数 2n+1个
2. m-n+1, ... m, m+1, ... ,m+n 偶数个连续数 2n个

对于1. 其和为 (m-n + m+n)*(2n+1)/2=m*(2n+1)
对于2. 其和为 (m-n+1 + m+n)*2n/2 = (2m+1)*n

综合1,2,可以看到,连续若干个数相加得到的结果一定包含一个奇数因子。因此,一定不能被分解成若干个连续数相加的数就是2^x。因为2^x不包含奇数因子
lizhengnan 2010-11-04
  • 打赏
  • 举报
回复
我可不觉得穷举法是个好方法。
peng2739956 2010-11-04
  • 打赏
  • 举报
回复
LZ是想 输入一个数然后输出 的数加起来等于输入的数 那么你要规定输出的数到底是几个。
最简单的就是用穷举咯 我觉得穷举简单多了
昨日,11.19,最新整理了,第61-80,现在公布上传。 另加上之前公布的第1-60 ,在此做一次汇总上传,以飨各位。 可以这么说,绝大部分的面试,都是这100 道系列的翻版, 此微软等公司数据结构+算法面试100 系列,是极具代表性的经典面试。 而,对你更重要的是,我自个还提供了答案下载,提供思路,呵。 所以,这份资料+答案,在网上是独一无二的。 ------------------------------------ 整理资源,下载地址: 答案系列: 1.[最新答案V0.3 版]微软等数据结构+算法面试100 [第21-40 答案] http://download.csdn.net/source/2832862 2.[答案V0.2 版]精选微软数据结构+算法面试100 [前20 ]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1 版本,进行的校正与修正。 3.[答案V0.1 版]精选微软数据结构+算法面试100 [前25 ] http://download.csdn.net/source/2796735 目系列: 4.[第一部分]精选微软等公司数据结构+算法经典面试100 [1-40 ] http://download.csdn.net/source/2778852 5.[第1 -60 汇总]微软等数据结构+算法面试100 http://download.csdn.net/source/2826690 更多资源,下载地址: http://v_july_v.download.csdn.net/ 若你对以上任何目或任何答案,有任何问,欢迎联系我: My E-mail: zhoulei0907@yahoo.cn ------------- 作者声明: 本人July 对以上公布的所有任何目或资源享有版权。转载以上公布的任何一, 或上传百度文库资源,请注明出处,及作者我本人。 向你的厚道致敬。谢谢。 ---July、2010 年11 月20 日。 ------------------------------------------------------ 各位,若对以上100任何一道,或对已上传的任何一的答案, 有任何问,请把你的思路、想法,回复到此帖子上, 微软等100系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧