代码改变世界

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

2009-09-17 21:59  Iron  阅读(250)  评论(0编辑  收藏  举报

《编程之美》--只有加法的面试题 - hxf829 - 学海无涯 天道酬勤本题在《编程之美》没有给出答案,作者只是说此题比以前的题比较简单,今天到图书馆翻到,发现此题(难与不难暂且不说)还是挺有意思的。
以下是我的解决程序:
解决思路:
1. 先从start=1,end=2开始,如果start没有超过n的一半且end没有大于n,如果n大于sum(从start加到end的和)则将end增1,否则将start增1;
2. 重复1。
本题要求输出所有的结果,故而得到一种结果后,如果start没有超过n的一半且end没有大于n,则将start增1以后继续搜寻结果,直到不否和条件为止。

程序:
#include <iostream>
using namespace std;
void GetContinuousNum(int n)
{
     int start = 1;
     int end   = 2;
     int sum;
     for(;(start < (n/2+1)) && end < n; )
     {
         //得到从start加到end的结果
         sum = (end*end+end-(start-1)*(start-1)-(start-1))/2;
         if(sum < n)
             end ++;
         else if(sum > n)
             start ++;
         else
         {
             //输出结果
             for(int i = start; i < end+1; i ++)
                 cout << i << " ";
             cout << endl;
             start ++;
         }
     }
}
int main()
{
    GetContinuousNum(6);
    system("pause");
}

编程之美在本小节中还有两问,第二问的数的规律好像是2的幂次值,但想来想去还是没法用数学方法证明,可能是程序写多了,高中的那种做证明题的感觉已经不在了《编程之美》--只有加法的面试题 - hxf829 - 学海无涯 天道酬勤,哪位过路人如有解答,请不吝赐教(第三问也是)~