这段c程序问题在哪?

来源:百度知道 编辑:UC知道 时间:2024/05/17 07:41:14
谭老爷子的<c程序设计>习题:有n个人排成个圆圈,顺序排号,从第一个开始报数,从1到3报数,凡报到3的人出列,问最后能留下的那位是原来的第几号?
算法:定义个元素很多的int数组,输入排队的人数,只循环指定的元素个数。我将所有元素都初始化为1,进行循环,每数过3个值为1的元素后将第3个赋值为0,如数到值为0的元素则继续,大循环n-1次(每次改1个元素值为0),然后输出值为1的元素的下标。

下面是代码,不知道是代码还是算法的错误,有2个警告,运行后输入数据后等待很久没有输出,希望大家帮助解决问题。

#include<stdio.h>
main()
{
int a[1000],n,i;
int so(int *p,int n);
scanf("%d",&n);
i=so(a,n);
printf("%d\n",i);
}
int so(int *p,int n)
{
int i,k,m;
k=0;
for(i=0;i<n;i++)
*(p+i)=0;
for(i=0;i<n-1;i++)
{
if(i=0)
{
k+=2;
*(p+k)=0;
}
else
{
for(m=1;m<=3;)
{
k++;
if(k==n)
k=0;
if(*(p+k)==1)
m++;
}
*(p+k)=0;
}
}
for(i=0;i<n;i++)
{
if(*(p+i)==1)
{
return(i);
break;
}
}
}
if(i=0)改正

这个算法不太好
最好换个算法
例如用链表来写
挺简单的
数组写在边界的地方很容易出错
这个应该是约瑟夫环问题,一般的数据结构书上都有算法

上面的程序,初试化的时候,前N个应该初试化为1,不是0
后面循环来循环去应该也有错,有个地方是死循环,看晕了我,最好用链表写啦,出队的时候直接把节点删掉就好了:)也比较节省空间

另外用C语言写的时候,最好数组全部成员可以明确的初试化为0

程序没看完,但瞟到这一句了,明显不对。if(i=0)

...
int so(int *p,int n)
{
int i,k,m;
k=0;
for(i=0;i<n;i++)
*(p+i)=1; /**/
for(i=0;i<n-1;i++)
{
if(i==0) /**/
...

看的眼睛疼....

if(i==0)