但有点看不明白,可否结实一下
[此贴子已经被作者于2006-8-15 2:54:11编辑过]
http://www. 第二站>>>提供源码下载
没考虑到2?怎么说,请指教。。。
Num==2时,if(i%2!=0&&Num%i==0)ans++;if(i%2==0&&(Num-i/2)%i==0)ans++;
这两个都不满足。所以ans==0;请问哪里有问题?
我说说我的想法:
由于是连续数的和加起来等于Num;那么我想用这个连续数的个数来作为循环的条件
因为比如3个连续数的和等于Num;那么3个数的连续数只有唯一的这一个。
根据这种唯一性,判断从2个到max个这么多种不同情况的连续数个数的和是否有等于Num.这个判断是否就是通过两个if语句判断的。
先说说那个max来由:
假设有n个连续数,从1加到n要小于等于<Num数学可得到:
n<(int)pow((double)2*Num,0.5)+1;而<后面的就是max。
因此限定连续数个数的范围。
再看if语句(i表示连续数的个数,所以必须从2开始):
如果是奇数个连续数,那么他们的平均值就是在他们正中间的那个数,所以需要
Num%i==0;因为Num/i这个时候就是这个平均值。这时确定一个解。
如果是偶数个连续数,这时,我举几个例子似乎容易理解点:
比如4个连续数:3,4,5,6本来3,4,5奇数个连续,平均值4,现在右边多出一个数字,偏离平均值数字2位(也就是大2)。
再比如6个连续数:1,2,3,4,5,6相当于1,2,3,4,5的中心值偏离3(大于3)
可以看出,每增加2个连续,他的多出来的值就比平均值多偏离一位。
想要Num是这些连续数的和,只需要Num减去这个多出来的偏离值再去除以i来确定是否整除,如果成立,这时确定一个解。(当然,由于前面的n有限定,所以n的个数会因为Num而有限制)
大家可以想一下:任给一个数,我假设是100,那么如果是偶数的话,比如有10个连续数,那么(100-5)%10 !=0,所以没有这种解,换一个:8,那么(100-4)%8==0;有解,为什么呢?(100-4)/8=12;
那么解为:9,10,11,12,13,14,15,16
希望大家能看懂