求助 帮看看程序 那错了
N个人组成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?那位打个看看我的程序那错了! 谢谢了
#include<stdio.h>
f(int *pt,int n)
{int m,i,t;
m=n%3;
while(n>=3)
{n=(n-n/3);
for(i=1;i<=n;i++)
{if(i=3) continue;
t=i/3;
*(pt+i-t-1)=*(pt+t);
}
for(i=n;i>=1;i++)
*(pt+i-1+m)=*(pt+i-1);
for(i=1;i<=m;i++)
*(pt+i-1)=*(pt+n-m+1);
}
for(i=0;i<n;i++)
printf("%d",*(pt+i));
}
#define N 5
void main()
{int a[N],*p,i;
p=a;
for(i=0;i<N;i++)
a[i]=i+1;
f(p,N);
}
----------------解决方案--------------------------------------------------------
偶写的:
#include<stdio.h>
#include<stdlib.h>
int judge_(int* array,int n) //判断是否只剩一人
{
int count=0,flag=-1;
for(int i=0;i<n;i++)
if(array[i]==0) { flag=i+1; count++;}
if(count==1) return flag;
else return 0;
}
int reslut(int n)
{
int * people=(int*)malloc(sizeof(int)*n);
int i=0,rlst=-1,m=0;
for(;i<n;i++) people[i]=0;
for(i=1;;)
{
if(rlst=judge_(people,n)) { free(people); return rlst; }
//第m+1个人没出去
if(!people[m])
{
if(i==3) //数到三
{
people[m%n]=1; i=1;
}
else i++;
m=(m+1)%n;
}
else //第m+1个人出去
{
while(people[(++m)%n]);
if(i==3)
{
people[m%n]=1; i=1;
}
else //否则
{
i++;
}
m=(m+1)%n;
}
}
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF) printf("%d\n",reslut(n));
return 0;
}
[[it] 本帖最后由 中学者 于 2008-2-3 18:12 编辑 [/it]]
----------------解决方案--------------------------------------------------------
楼主的意思是循环报数吗?最后剩下两个的那种?
----------------解决方案--------------------------------------------------------
我知道那错了!!谢谢支持 重新发一遍!
#include<stdio.h>
void f(int *pt,int n)
{int m,i,t;
while(n>=3)
{m=n%3;
for(i=0;i<n;i++)
{if((i+1)%3==0) continue;
t=(i+1)/3;
*(pt+i-t)=*(pt+i);
}
for(i=n-1;i>=0;i--)
*(pt+i+m)=*(pt+i);
for(i=0;i<m;i++)
*(pt+i)=*(pt+n-1);
n=(n-n/3);
}
for(i=0;i<n;i++)
printf("%5d",*(pt+i));
}
#define N 5
void main()
{int a[N],*p,i;
p=a;
for(i=0;i<N;i++)
{a[i]=i+1;
printf("%2d",a[i]);
}
printf("\n");
f(p,N);
getch();
}
----------------解决方案--------------------------------------------------------