免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2277 | 回复: 9
打印 上一主题 下一主题

[C] 如何产生这个数字序列? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-22 15:46 |只看该作者 |倒序浏览

变量 X=1

如何产生以下序列?(使X按序列值变化)
+1, 0, -1, 0, +1, 0, -1, 0, +1, ……

不要For循环, 越简单直接越好。可引入辅助整形变量a,b,c,比如这类形式:
a=-1
X=X+a^X

PS:这个问题是《组合数学》学科研究范围吗?

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2016-11-22 17:48 |只看该作者
回复 1# proof

不要For循环, 越简单直接越好
你这话还真矛盾

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2016-11-22 18:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
4 [报告]
发表于 2016-11-22 19:11 |只看该作者
静态 整型 待选集[3] = {1,0,-1};

内联 整型 检索序列(无符号 整型 索引) {返 待选集[索引%3];}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2016-11-23 08:40 |只看该作者
y = (2-(x+1)%4)%2

  1. #include <stdio.h>

  2. int main( void )
  3. {
  4.     for( int x=0; x<20; ++x )
  5.         printf( "%+d\n", (2-(x+1)%4)%2 );

  6.     return 0;
  7. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2016-11-23 09:20 |只看该作者
本帖最后由 proof 于 2016-11-24 15:12 编辑

      索引法:待选集[3] = {1,0,-1};
通项公式法:y = (2-(x+1)%4)%2

感谢各位。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2016-11-23 10:56 |只看该作者
本帖最后由 hellioncu 于 2016-11-23 10:59 编辑
  1. struct foo
  2. {
  3.         unsigned int s:2;
  4.         unsigned int v:1;
  5. };


  6. int bar(struct foo *p)
  7. {
  8.         p->s--; p->v--;
  9.         return p->s == 3 ? -1 : p->v ;
  10. }

  11. int main()
  12. {
  13.         struct foo f;
  14.         f.s = 2; f.v=0;
  15.         printf("%d\n", bar(&f));
  16.         printf("%d\n", bar(&f));
  17.         printf("%d\n", bar(&f));
  18.         printf("%d\n", bar(&f));
  19.         printf("%d\n", bar(&f));
  20.         printf("%d\n", bar(&f));
  21.         printf("%d\n", bar(&f));
  22.         printf("%d\n", bar(&f));

  23.         return 0;
  24. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2016-11-24 14:44 |只看该作者
不要For循环只能用递归了
尾递归应该是最合适的,同时看返回值和索引值。

论坛徽章:
0
9 [报告]
发表于 2016-11-24 15:03 |只看该作者
不一定最简单,但最直接的方法:

int recursive(int n, int total)
{
        if (n >= total)
                return 0;
        int x = n%4;
        int ret = 0;
        switch(x)
        {
        case 0:
                ret = 1;
                break;
        case 1:
                ret = 0;
                break;
        case 2:
                ret = -1;
                break;
        case 3:
                ret = 0;
                break;
        }
        printf("%d", ret);
        return recursive(n+1, total);
}

main()
{
recursive(0, 1024);
}

论坛徽章:
0
10 [报告]
发表于 2016-11-24 15:10 |只看该作者
感谢大家。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP