自己给自己拍板砖 算法的效率真是不能比啊。。
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 编辑 ]









