51 nod 1138 连续整数的和

31 篇文章 0 订阅
基准时间限制:1 秒 空间限制:131072 KB 分值: 10  难度:2级算法题
 收藏
 关注
给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。
Input
输入1个数N(3 <= N <= 10^9)。
Output
输出连续整数中的第1个数,如果有多个按照递增序排列,如果不能分解为若干个连续整数的和,则输出No Solution。
Input示例
15
Output示例
1
4

7

根据等差数列的性质m=na1 + n(n-1)/2

a1=(2m-n²+n)/(2n),当n=√2m时a1=1/2,此函数是一个单调递减函数,随着n的减小,a1逐渐增大,则将n随之间小遍历即可。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long m,i,k;
	cin>>m;
	bool ans=false;
	int c=sqrt(2*m);
	for(i=c; i>=2; i--)
	{
		k=2*m-i*i+i;
		if(k%(2*i)==0)
		{
	    	ans=true;
			cout<<(k)/2/i<<endl;
	    }
	}
	if(ans==false)
	cout<<"No Solution"<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值