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

问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;问题2. 例如32就找不到这样的表达,这样的数字有什么规律?问题3. 在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?问题1直接见代码,如下:/*****************************************************
摘要由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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值