编程之美2.21 只考加法的面试题

本文探讨了关于64位正整数的几个问题:如何找出所有可能的连续自然数之和的算式;发现只有2的乘方无法表示为连续自然数之和;并分析了64位正整数中子序列最多的情况,涉及奇数因子的计数方法。作者提出了问题并给出了部分证明和分析,邀请读者共同探讨解决方案。
摘要由CSDN通过智能技术生成

问题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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值