问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;
问题2. 例如32就找不到这样的表达,这样的数字有什么规律?
问题3. 在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?
问题1直接见代码,如下:
/*******************************************************************************
将正整数N表示成k个连续的正整数之和,设第一正整数为x,则2N - k(k - 1) = 2kx;
当长度为k-1和k时,等式分别如下如下:
2N - (k * k - 3k + 2) = 2(k - 1)x;
2N - (k * k - k) = 2ky;
将两式相减得:
-2(k - 1) = 2(y - x)
令等式左边的结果为product,等式右边的系数为divisor。product和divisor存在以下递推
关系:
product(k) = product(k - 1) - divisor(k - 1)
divisor(k) = divisor(k - 1) + 2;
由于k至少为2,则根据k = 2分别给product和divisor赋初值,分别为2N - 2,4;product一
直减少,而divisor一直增加,故当product < divisor时,此后product / divisor会一直为
0,故循环结束的条件是product < divisor。
*******************************************************************************/
unsigned long long SerialNumSumEqualN(unsigned long long N)
{
if ((N & N - 1) == 0)
return 0;
unsigned long long count = 0;
unsigned long long product = 2 * N - 2;
unsigned long long divisor = 4;
while (product >= divisor)
{
if (product % divisor == 0)
{
++count;
unsigned long long begin = product / divisor;
unsigned long long end = begin + divisor / 2 - 1;
for (; begin < end; begin++)
cout << begin << " + ";
cout << end << " = " << N << endl;
}
product -= divisor;
divisor += 2;
}
return count;
}
问题2 分析如下:
公式2N = k(2x + k - 1)中,k和2x + k - 1中一个为奇数,另一个为偶数,且奇数肯定大于等于3。因此猜想N的因子中只要包含大于等于3的奇数即可。先证明该猜想如下:
令N = a * b,其中a为大于等于3的奇数,b为任意正整数。则2N = a * 2b;
令a = k,2b = 2x + k - 1,求解得k = a,x = (2b + 1 - a) / 2,又x >= 1,可得a <= 2b - 1;
令a = 2x + k - 1,2b = k,求解得k = 2b,x = (a + 1 - 2b) / 2,又x >= 1,可得a >= 2b + 1;
由于a为奇数,所以a必定满足且仅满足其中一种情况,得证。
因此只有2的乘方找不到这样的表达。
问题3分析如下:
令N = a1 * b1 = a2 * b2,且a1,a2为大于等于3的不同的奇数,b1,b2为任意正整数,则b1,b2也不同,则a1,a2,2b1,2b2均不同,又k = a或2b,因此k1和k2不同,因此a不同时,对应的子序列也不同。即N有多少个大于等于3的奇数因子,则有多少个对应的子序列。
令N = (a1^n1) * (a2^n2) *...* (am^nm) * 2^k。其中’^‘表示乘方,a1,a2,am为大于等于3的不同质数,n1,n2,nm为他们对应的指数且均大于等于1,每个质数ai相乘的个数有(n i+ 1)中选择,但要除去所有质数相乘的个数为0(相乘的结果为1)这种情况,则N所有大于等于3的奇数因子的个数为:
count =(n1 + 1)*(n2+ 1)*(nm + 1)- 1。
要找到在64位正整数中,子序列数目最多的那个正整数,即满足N = (a1^n1) * (a2^n2) *...* (am^nm) * 2^k < 2^64,且count =(n1 + 1)*(n2 + 1)*(nm + 1)- 1为最大这样条件的正整数N。
具体的求解暂时没想出来。各位有想法的还请不吝赐教。
欢迎转载,转载请注明出处http://blog.csdn.net/hugang012070/article/details/12292493。