改编自 uva 10025 简单的加减法
简单的加减法
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }
Do one thing , and do it well !