| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1581 人关注过本帖
标题:最简单的问题把我给搞迷了
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
没看明白我的意思?
f(100)的返回值就是1-2+3-4+5-……+99-100的结果。
你还可以验证一下f(x)的结果。

重剑无锋,大巧不工
2012-01-12 23:11
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:1 
回复 7楼 beyondyf
厉害

The quieter you become, the more you can hear
2012-01-12 23:58
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 11楼 beyondyf
#define f(n)    (((n)&1)*(n)-(n)/2)
你这个公式确实厉害,虽然相与应用的还不是太熟练,但是这个式子确实管用,你这个公式是怎么算出来的?
n&1的意思是,不管n的值是多少,如果他的二进制码最后一位是0,那么n&1的值就是0,如果n的二进制最后一位是1,他们的值是不是就成了1呢?
这里的1起的是什么作用呢?

[ 本帖最后由 小赵q1 于 2012-1-13 00:22 编辑 ]
2012-01-13 00:10
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:1 
以下是引用beyondyf在2012-1-12 13:01:24的发言:

1、你想要的方法int f(int n)
{
    int i, c, f;
    for(c = 0, f = i = 1; i <= n; c += i * f, i++, f = -f);
    return c;
}2、实际该用的方法int f(int n)
{
    return (n & 1) * n - n / 2;
}
3、用宏代替
#define f(n)    (((n)&1)*(n)-(n)/2)
无敌了,拜服。。。

为游戏狂~~!!    大家努力编哈!
2012-01-13 09:00
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
以下是引用beyondyf在2012-1-12 13:01:24的发言:

1、你想要的方法int f(int n)
{
    int i, c, f;
    for(c = 0, f = i = 1; i <= n; c += i * f, i++, f = -f);
    return c;
}2、实际该用的方法int f(int n)
{
    return (n & 1) * n - n / 2;
}
3、用宏代替
#define f(n)    (((n)&1)*(n)-(n)/2)

请新手们注意,正确的宏定义就是要象版主beyondyf这么写,一个括号都不要少

总有那身价贱的人给作业贴回复完整的代码
2012-01-13 09:44
笨小孩111
Rank: 2
等 级:论坛游民
帖 子:4
专家分:27
注 册:2011-12-17
收藏
得分:1 
回复 4楼 liao06550107
大哥,你这可是死循环啊
2012-01-13 11:00
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这个规律几乎是一目了然的,我也不是卖关子,各位还没观察出来的朋友我希望再想想,希望小赵能亲自讲解一下那公式的来由。

关于那个宏,看来embed_xuel版主是业内人士。没有实际经验新人往往注意不到这样的细节。

重剑无锋,大巧不工
2012-01-13 17:17
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
部分和为:
1 = 1,
1 − 2 = −1,
1 − 2 + 3 = 2,
1 − 2 + 3 − 4 = −2,
1 − 2 + 3 − 4 + 5 = 3,
1 − 2 + 3 − 4 + 5 − 6 = −3
当n为偶数时,结果为:(-1)*(n/2),当n为奇数时,结果为:1*(n+1)/2,
因为偶数的二进制码最后一位永远是0,奇数的二进制码最后一位永远是1,
所以就用(n&1)的方法判断n是奇数还是偶数,并得出一个值是0或1,当n为偶数时,结果为0-(n/2),当n为奇数时,结果1,
0*任何数都是0所以当n为偶数时公式变为:0*n-(n/2),
当n为奇数时,公式变为:1*n-(n/2),因为都是整数,n/2的结果取整。
看维基百科,初中毕业的我表示看的一头雾水,还是慢慢来吧。
2012-01-14 11:10
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:1 
#include  <stdio.h>

int  main(void)

{
    int i = 1, sum = 0, flag = -1;

    while (i <= 100)

    {
        flag *= -1;

        sum += i++ * flag;
    }

    printf("%d\n", sum);

    return  0;
}
2012-01-14 15:46
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 18楼 小赵q1
分析的差不多,就是复杂了点。

其实这么想问题就非常简单,将数列两两看作一组,前一项为k(奇数), 后一项为 -(k + 1),其和是 -1。如果数列长为偶数,那么其总和就是1/2长度个-1,为奇数时就加上最后那个奇数。

这关系是不是非常简单?

重剑无锋,大巧不工
2012-01-14 19:39
快速回复:最简单的问题把我给搞迷了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021436 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved