作者:手机用户2602897411 | 来源:互联网 | 2023-07-21 12:15
网上存在很多对该问题的解答,但是很多解答都有错误,比较正确的是http:blog.csdn.netlyso1articledetails5399146,但是问题解法较为复杂,在
网上存在很多对该问题的解答,但是很多解答都有错误,比较正确的是http://blog.csdn.net/lyso1/article/details/5399146,但是问题解法较为复杂,在此将从另一个思路对问题进行解答,很大程度简化了算法正确性的证明。
------------------------------------------------------------------------------------------------------------------------------------------
问题1.写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;
问题2.例如32就找不到这样的表达,这样的数字有什么规律?
问题3.在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?
------------------------------------------------------------------------------------------------------------------------------------------
将一个正整数表示成连续自然数之和,即N=s+(s+1)+(s+2)+…+(e-1)+e。利用等差数列求和公式,我们有


也即2N=(s+e)(e-s+1),该等式表示可以将2N分解成两个正整数的乘积。我们设x=s+e, y=e-s+1(其中x>y)。利用x、y我们可以求解获得s和e:


因为s和e都是整数,因而为了使上面的式子能整除,则x和y必须一奇一偶。因为2N=xy,2N含有偶因子,所以N必须含有奇因子才能使等式成立。这也就证明了N能表示成连续自然数的充要条件:N必须含有奇数因子,问题二得证。
利用公式(2),我们即可获得正整数N的一个连续自然数序列。为了输出所有的连续自然数序列,我们需要获得所有的x和y组合,也即求2N的所有因子组合。我们可以利用算法基本定理将2N分解成有限个质数的乘积:

我们将2N按照质因子进行分解,由于x和y只有一个偶数,所以2N的分解式中质因子2的所有组合都只能在其中一个数中,否则x和y都是偶数。不妨假设x是偶数,则

其中
。由此我们可以知道,2N的所有质因子组共有(j+1) (k+1)…组。由于当x等于2N时,y等于1,此时的连续自然数个数为1,小于2,所以满足条件的连续自然数序列个数为:(j+1) (k+1)…-1,这就回答了问题一,我们可以首先获得2N的所有质因子分解,然后组合质因子并满足x>y即可获得所有的序列。
问题三按照网上的资料,有两种理解方式:1)、可以表示为最多个序列的那个数;2)、序列中项最多的那个数。但是按照题意其实应该是第一种理解方式。由于质因子2只能在x和y的某一个数中,对质因子分解不起作用,所以为了让序列个数尽可能多,N的质因子中不能包含2。因此若让子序列个数最多,则即(j+1) (k+1)…最大。通过简单分析我们可以获得具有最多序列个数的正整数j、k等质因子指数的两个性质:

性质一可以通过替换来证明,假设当前的最大序列个数不满足性质一,设第一个不满足性质的两个指数为a和b,满足a1)开始,则我们可以将该最多项的每一项均减去s-1,则最多项等价于从1开始的最多项,也即我们至少可以构造和之前的最多项一样长的新序列。此外,由于每一项均减少了s-1,如果此时减少的和大于最多项的最大项,我们还可以添加新的项到最多项的末尾,产生更长的最多项。