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

在《编程之美》里面有一个“只考加法的面试题”。题目如下:

我们知道:

1+2 = 3;

4+5 = 9;

2+3+4 = 9。

等式的左边都是两个或两个以上连续的自然数相加,是不是所有的整数都可以写成这样的形式呢?

问题1:  对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。

问题2:  大家在测试上面程序的过程中,肯定会注意到有一些数字不能表达为一系列连续的自然数

之和,例如32好像就找不到。那么,这样的数字有什么规律呢?能否证明你的结论?

问题3: 在64位正整数范围内,子序列数目最多的数是哪一个?

第一次看到这样的题目。我想了一下,第一个问题其实是一个公差为1的等差数列。求的是X是否可以分成一个这样的数列。

所以我只要求出这个数列的首项a1和项数n(公差已知是1)。我的代码如下:

int solveProblem(int key)
{
	int n1,n2; //方程的两个解
	int det = 0; //判别式
	int n,a1; //数列的和和数列项数 数列首项
	for(a1 = 1;a1 <= key/2;a1++){
		det = (2*a1 - 1)*(2*a1 - 1) + 8*key; //算出判别式
	if(det < 0)
		continue;
	else{//求出两个解
		n1 = (1 - 2*a1 + (int)sqrt(det))/2;
		n2 = (1- 2*a1 - (int)sqrt(det))/2;
	}
	//判断两个解是否符合条件
	if(n1 > 0){
		if(2*key == (2*a1 + n1 -1)*n1)
			printf("找出一个解 a1 = %d ,n = %d\n",a1,n1);
	}
	if(n2 > 0){
		if(2*key == (2*a1 + n2 -1)*n2)
			printf("找出一个解 a1 = %d ,n = %d\n",a1,n2);
	}
	}
}

   

我让首项a1从1开始循环,寻找是否有符合题意的项数n。具体是根据 key ,a1, n它们之间的关系构造了一个关于n的一元二次方程。

解出n,因为程序里面对解出的n取了整数,所以我还要用公式验证一下n是否就是我们要求的。如果是,就打印结果。但我还有两个问题:

1>我不知道这个算法是否可以求出一个数的所以符合条件的序列。

2>算法的运行时间O(n),线性增长。我算一个亿级别的数需要10多秒。不知道是否还有优化的余地

 

这些问题放在这里,以后会解决的。最近要考试了,美术,电脑,体育,舞蹈,一个接一个都考完了。下个星期再把文化课考完就放暑假了。暑假我准备和同学到当地打暑假工。不过我不知道能不能找到,随缘吧。总之,最近比较烦,烦的事不想说了。

(全文完)

若非注明,均为原创文章,转载请注明: 转载自大笨兔博客

你可能感兴趣的:(《编程之美》)