改编自 uva 10025 简单的加减法

简单的加减法

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 8  Solved: 3
[Submit][Status][Discuss]

Description

 

 bs神的数学太牛了,他经常想一些极难极坑爹数学问题作弄同学,这不愚人节快到了,他又有坏点子了。我们都知道对于式子@1@2@3.....n-1@n,如果要求用'+'或'-'来代替@,那么最终肯定能得到
一个整数T,使@1@2@3.....n-1@n=T,这是相当简单的。但是bs神太坏了,现在给你整数T,让你求出最小的n,使@1@2@3.....n-1@n=T成立(@依然用'+'or'-'代替)。例如:T=12时,有
- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 ,此时n最小。

 

Input

 

多个测试数据,一个测试数据(T)占一行,输入以文件结束为标志。(0<=|T|<=1000000000)

 

Output

 

对于每个T,输出对应的最小n(n>=1),每个一行哦。

 

Sample Input

0
1
2
-298000

Sample Output

3
1
3
772



这个题源自UVA 10025改编而来,放在了我们学校的oj上,(有点侵权的意思)。。。拿到这个题真心不会,但是看完解题报告感觉这题也不是多么难,只是我目前的水平还推不出来。废话少说,开始写思路


给定一个k,不用管是负的还是正的,因为负的和正的可由变号得到。再此以正数为例讲解。假定sum1=1+2+3+……+n>=k;那么肯定存在sum2=1.2+...n=k;(...表示正负不确定)
因而可以得到 sum1-sum2=? 那么?的判定条件是什么呢?咱们可以推出sum2 的负号所对应的数总是sum1中减少的2倍。因而不难得到,sum1-sum2(即 sum1-k)一定是偶数。
剩下的就是暴力了。。


此题代码如下:


#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    int n,sum;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        n=fabs(n);
        for(int i=1;;i++)
        {
            sum+=i;
            if(sum>=n && (sum-n)%2==0)
            {
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}

  

 
posted @ 2013-03-30 20:17  ZeroCode_1337  阅读(273)  评论(0编辑  收藏  举报