poj 1844 sum

 

Sample Input

12

Sample Output

7

Hint

The sum 12 can be obtained from at least 7 terms in the following way: 12 = -1+2+3+4+5+6-7.
 
 
大牛们证明的:

一:sum一定要大于或等于输入的S.(等于时就已经找到了答案)
小于的话就算全做加法运算也不能达到S。

二:在满足第一条的情况下,注意一定要满足第一条后
第一次碰到(sum - S ) % 2 == 0
 这里( sum = 1 + 2 + .... + i )这时的i就是答案。
证明如下:
1:若res是奇数,就说明res = ( 1 + 2 + ... + i )- S 是奇数
也就是说无论你怎么改变sum( sum = 1 + 2 + .... + i )的表达式
(当然是通过改变其中的加号为减号)也无法让res为0
举个例子吧:S = 5, sum = 1+2+3 = 6, res = 6 - 5 = 1;
无论改变(1+2+3)中的加号也没用,这是因为你在sum中改变一个加号为减号
时它的值就一定减少了一个偶数值(这是显然的)sum-S仍然为奇数
2:令res = sum - S,则res一定是0,2, 4, 6....中的一个
下面说明总可以通过改变sum表达式中的某几个加号为减号使得res为0
当k = 0的情况就不用说明了吧, 假设2k表示res 显然k = 1 2 3 4...
当k = 1 时可以通过把sum( sum = 1 + 2 + ... + i )
改成( sum = -1 + 2 + ... + i )
当k = 2 时可以通过把sum ( sum = 1 + 2 + ... + i )
改成( sum = 1 - 2 + ... + i )
一次类推res总可以变为0

#include <stdio.h>
int main(int argc, char *argv[])
{
	int S,sum,i;
	while(scanf("%d",&S)!=EOF)
	{
		sum=0;
		for (i=1;;i++)
	    {
 			sum+=i;
 			if(sum>=S) break;
 		}
 		if(sum==i) printf("%d",i);
 		else
	 	{
	 	    while((sum-S)%2!=0) 
			{
				i++;
				sum+=i;
			}	
		 	 printf("%d\n",i);
	    }
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值