| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 529 人关注过本帖, 1 人收藏
标题:自己给自己拍板砖 算法的效率真是不能比啊。。
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:5 
自己给自己拍板砖 算法的效率真是不能比啊。。
https://bbs.bccn.net/thread-339180-1-1.html

这里面的那个报数程序 数一大就很慢 不过写的时候考虑的是省内存 后来又写了一个 发现效率真是不能比啊。。

原题目

m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。到最后只余1人,输出最后留下的是第几号 (最初的序号,以1起始)。若m=6,则输出n=1<CR>  3 6 4 2 5 1;若m=10,则输出n=4<CR> 3 6 9 2 7 1 8 5 10 4;若m=100,则输出n=91<CR> 3 6 9……100 58 91。函数int fun(int n ,int *p)实现上述功能,返回n个人中最后余的1人的起始序号,并将退出的序号顺序写入p指向的数组中。

新程序包含了旧的 所以重新帖一遍罢。。

顺便问个问题 Code::Blocks 有人用么 感觉启动速度挺慢的 有没有办法优化下 谢谢。。

程序代码:

#include<stdio.h>
#include<string.h>
#include<time.h>

//#define FAST    /* for test */

#define M 100000

/* fast but use a buffer */
int baoshu_fast(int n,int *p)
{
    int buf[M] = {0};
    int pick = 1;
    int j = 0;
    int put = 0;

    while (put < n)
    {
        if (p[pick] != -1)
        {
            if (2 == j++)
            {
                buf[put++] = p[pick];
                p[pick] = -1;/* will not be picked */
                j = 0;
            }
        }

        pick++;

        if (pick > n)
        {
            pick = 1;
        }
    }

    memcpy((void *)&p[1],(void *)&buf[0],n*sizeof(int));

    return (p[n]);
}


int baoshu_savemem(int n,int *p)
{
    int i = 0;
    int pick = 1;
    int j = 0;

    for (; i<n-2; i++)
    {
        pick += 2;
        /* (n-i) nums */
        if (pick > (n-i))
        {
            pick -= (n-i);
        }
        p[n+1] = p[pick];    /* p[pick] == *(p+pick) */
        /* slow */
        /*
        for (j=pick; j<n+1; j++)
        {
            p[j] = p[j+1];
        }
        */
        /* faster */
        /* memcpy (void*, const void*, size_t); */
        memcpy((void *)&p[pick],(void *)&p[pick+1],(n-pick+1)*sizeof(int));
    }

    if (pick > (n-i))
    {
        pick -= (n-i);
    }

    /* 2 nums left */
    p[n+1] = p[pick];

    /*
    for (j=pick; j<n+1; j++)
    {
        p[j] = p[j+1];
    }
    */

    memcpy((void *)&p[pick],(void *)&p[pick+1],(n-pick+1)*sizeof(int));

    p[n+1] = p[1];

    /*
    for (j=1; j<n+1; j++)
    {
        p[j] = p[j+1];
    }
    */
    memcpy((void *)&p[1],(void *)&p[2],n*sizeof(int));

    return (p[n]);
}

int main(void)
{
    int m = 0;
    int a[M] = {'\0'};
    int i = 1;
    long start = 0l;
    long end = 0l;

    printf("Please input m(1<m<%d):",M-1);
    scanf("%d",&m);

    /* a[0] will not be used */
    for (i=1; i<=m; i++)
    {
        a[i] = i;
    }
    start = clock();
    #ifdef FAST
    printf("n=%d\n",baoshu_fast(m,a));
    #else
    printf("n=%d\n",baoshu_savemem(m,a));
    #endif
    end = clock();

    for (i=1; i<=m; i++)
    {
        printf("%3d ",a[i]);
    }

    printf("\n");

    printf("I use %ld ms.\n",end-start);

    return 0;
}






[ 本帖最后由 zklhp 于 2011-5-10 17:47 编辑 ]
搜索更多相关主题的帖子: 一个人的 
2011-05-10 17:40
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
自己顶

感觉要学的还很多啊。。
2011-05-10 17:44
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:0 
我用CodeBlocks,启动速度一直是那样,也不知道怎么优化。

o(∩∩)Linux & Python 群:187367181
2011-05-10 18:49
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
死亡游戏问题   好像没有这么多吧
程序代码:
#include<stdio.h>
int main()
{  
    int a = 0,b = 0,c = 0,n = 0,sum = 1;
    int kill[150] = {0};
    int i = 0,j = 0,k = 1;
    scanf("%d %d",&a,&b);
    for(i = 1;i<=a;)
    {
        if(!kill[i])
        {
            if(sum == i)
                k++;
            else
            {
                k = 1;
                sum = i;
            }
            if(k==b)
            {
                printf("%d\n",i);
                break;
            }
            j++;
        }
        if(0 == j%b && !kill[i])
            kill[i] = true;
        i%=a;
        i++;
    }
    return 0;
}

                                         
===========深入<----------------->浅出============
2011-05-10 19:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用thlgood在2011-5-10 18:49:57的发言:

我用CodeBlocks,启动速度一直是那样,也不知道怎么优化。

我喜欢快 呵呵
2011-05-10 20:22
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:0 
回复 5楼 zklhp
反正我一开机codeblocks就打开的,直到关机也不推出。再慢也比其他的快……
你这个程序我也在写,不过还有错误。感觉我写的执行效率好低……

[ 本帖最后由 thlgood 于 2011-5-10 22:40 编辑 ]

o(∩∩)Linux & Python 群:187367181
2011-05-10 22:39
快速回复:自己给自己拍板砖 算法的效率真是不能比啊。。
数据加载中...
 
   



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

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