2.21 只考加法的面试题

[question]
我们知道:1+2=3;
              4+5=9;
              2+3+4=9;
等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?
写一个程序,对于一个32位正整数,输出它所有的连续自然数之和的算式。 

[analysis]

可以发现任意自然数序列其实是公差为1的等差数列,那么数列前N项和公式有a1*n +n*(n-1)/2 = sn,而这里sn = 输入的正整数input。通过分析a1只需在集合[1,input/2)中,把上式等效变形为n2+(2a1-1)n-2input = 0,n的取值为中学学得2a分之负b加减根号下b方减4ac,哈,如果n为一个正整数,那么符合条件输出。如何判断n为合法的正整数不是浮点数呢?看看我的solution吧。我算法的时间复杂度是O(N)线形级别的,不知哪位大虾的solution可以再快些。 

#include <iostream>
#include "math.h"
using namespace std;
bool isPositiveInt(float num)
{
	return (num - (int)num)==0?true:false;
}
void outputResult(int a1,float n,int input)
{
	int loopCounter = 1;
	int a = a1;
	cout<<a1;

	while(loopCounter<(int)n)
	{
		cout<<"+"<<a1+loopCounter++;
	}//while

	cout<<"="<<input<<endl;
}
int main(int argc, char* argv[])
{
	unsigned int input,i;
	cout<<"input any positive numbers you want to calculate with:"<<endl;
	cin>>input;
	cout<<endl<<"the possible data groups are"<<endl;
	float temp;
	for(i=1;i<=input/2;i++)//n*n+(2*a1-1)*n-2*input=0
	{
		temp = sqrt(8*input+(i+i-1)*(i+i-1));//b*b - 4ac
		temp = (1 + temp - i - i)/2;//(-b)+-temp/2a
		if(isPositiveInt(temp))
		{
			outputResult(i,temp,input);
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值