The ? 1 ? 2 ? ... ? n = k problem
Time Limit: 3000MS Memory limit: 65536K
题目描述
Given the following formula, one can set operators '+' or '-' instead of each '?', in order to obtain a given k
? 1 ? 2 ? ... ? n = k
For example: to obtain k = 12 , the expression to be used will be:
- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12
with n = 7
输入
The first line is the number of test cases, followed by a blank line.
Each test case of the input contains integer k (0<=|k|<=1000000000).
Each test case will be separated by a single line.
输出
For each test case, your program should print the minimal possible n (1<=n) to obtain k with the above formula.
Print a blank line between the outputs for two consecutive test cases.
示例输入
2 12 -3646397
示例输出
7 2701
#include<stdio.h>
int main()
{
int i,j,k,l,m,n,b;
scanf("%d",&l);j=0;
while(l--)
{
n=0;
if(j!=0)
printf("\n");
scanf("%d",&b);
j++;
if(b<0)
b=-b;
int flag=1;
for(i=1;;i++)
{
if(i*i+i>b*2)
{
break; //找最接近比b大的的前n个数,在此基础上修改符号
}
else if(i*i+i==b*2)
{
printf("%d\n",i);
flag=0;
break;
}
}
m=i;
if(!flag)
{
continue;
}
k=(m*m+m)/2-b; //多几个数
// printf("k %d\n",k);
if(k%2==0) //差是偶数不用填项
printf("%d\n",m);
else if(k%2==1&&m%2==1) //差是奇数,m下一项是偶数,添两项才能凑奇数
printf("%d\n",m+2);
else if(k%2==1&&m%2==0) //差是奇数,m下一项也是奇数,只添下一项就能凑奇数
printf("%d\n",m+1);
}
return 0;
}
#include<stdio.h>
int main()
{
int i,j,k,l,m,n,b;
scanf("%d",&l);j=0;
while(l--)
{
n=0;
if(j!=0)
printf("\n");
scanf("%d",&b);
j++;
if(b<0)
b=-b;
int flag=1;
for(i=1;;i++)
{
if(i*i+i>b*2)
{
break; //找最接近比b大的的前n个数,在此基础上修改符号
}
else if(i*i+i==b*2)
{
printf("%d\n",i);
flag=0;
break;
}
}
m=i;
if(!flag)
{
continue;
}
k=(m*m+m)/2-b; //多几个数
// printf("k %d\n",k);
if(k%2==0) //差是偶数不用填项
printf("%d\n",m);
else if(k%2==1&&m%2==1) //差是奇数,m下一项是偶数,添两项才能凑奇数
printf("%d\n",m+2);
else if(k%2==1&&m%2==0) //差是奇数,m下一项也是奇数,只添下一项就能凑奇数
printf("%d\n",m+1);
}
return 0;
}