nyist——sum 数论

描述
Consider the natural numbers from 1 to N. By associating to each number a sign (+ or -) and calculating the value of this expression we obtain a sum S. The problem is to determine for a given sum S the minimum number N for which we can obtain S by associating signs for all numbers between 1 to N. 

For a given S, find out the minimum value N in order to obtain S according to the conditions of the problem. 
输入
The input consists N test cases.
The only line of every test cases contains a positive integer S (0< S <= 100000) which represents the sum to be obtained.
A zero terminate the input.
The number of test cases is less than 100000.
输出
The output will contain the minimum number N for which the sum S can be obtained.
样例输入
3
12
0
样例输出
2
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 )表达式

       (当然是通过改变其中的加号为减号)也无法让res0

            举个例子吧:S = 5, sum = 1+2+3 = 6, res = 6 - 5 = 1;

  无论改变(1+2+3)中的加号也没用,这是因为你在sum中改变一个加号为减号

    时它的值就一定减少了一个偶数值(这是显然的)sum-S仍然为奇数

       2:令res = sum - S,则res一定是02, 4, 6....中的一个

       下面说明总可以通过改变sum表达式中的某几个加号为减号使得res0

         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 n,i,ans;
    while(scanf("%d",&n),n)
    {
        ans=i=0;
        while(ans<n||(ans-n)%2==1)
        {
            ans+=++i;
        }
        printf("%d\n",i);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值