为什么它只被执行了一次

fjdtsm 2002-06-15 08:17:53
我编了这样一个程序用来实现约瑟夫问题:
#include <stdio.h>
#define max_num 100
typedef struct node
{int number;
int flag;
}nodetype;
void main(void)
{nodetype array[max_num];
int i, j, k, m, n, l;
printf("input three integers: ");
scanf("%d%d%d", &i, &j, &k); /* i为总的个数, j开始位置, k为离开位置 */
printf("\n");
printf("input %d integers:\n", i);
for(m=0; m<i; m++)
{scanf("%d", &array[m].number);
array[m].flag=0;
}
printf("\n");
printf("The privite array is:\n");
for(m=0; m<i; m++)
printf("%4d", array[m].number);
l=i;
printf("\n");
printf("The leaving number:\n");
while(l>1)
{n=1;
for(m=j; m<i; m++)
{if(n==k&&array[m].flag==0)
{printf("%4d", array[m].number);
array[m].flag=1;
n=1;
}
else n++;
}
l--;
}
printf("\n");
}

可是当我输入10 1 4
然后再输入1——10
执行的结果怎么会只有4 跟8被打印了出来呢?
...全文
34 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjdtsm 2002-06-16
  • 打赏
  • 举报
回复
ynli2002(阿男)
谢谢你帮我解决了问题!
不过你的解决方法里还是有一点点问题
那个m不应该对(i-1)取模而应该对i取模。如果按照你的取模方法那么最终结果跟用笔来跟踪所得的结果是不是一样的。
cillin(我的蜕变)
谢谢你给我的建议!
还有我后来发现其它贴上去的算法也有问题。
现在我把我调试正确的算法贴上来。
我已经在TC2。0上调试通过了。且输入三组的数据给予验证最后结果跟我用笔做的结果是一致辞的。
***************************************************************/
/* program name: g.c */
/* program aim : a solution for Johnson's problem */
/* program langage: C program */
/***************************************************************/

/******************* head files ****************/
#include <stdio.h>
#define max_num 100
typedef struct node

/****************** data structure ***************/
{int number;
int flag;
}nodetype;
void main(void)

/***************** main *****************/
{nodetype array[max_num];
int i, j, k, m, n, l;
printf("input three integers: ");
scanf("%d%d%d", &i, &j, &k);
printf("input %d integers:\n", i);
for(m=0; m<i; m++)
{scanf("%d", &array[m].number);
array[m].flag=0;
}
printf("The privite array is:\n");
for(m=0; m<i; m++)
printf("%4d", array[m].number);
l=i;
printf("\n");
printf("The leaving number:\n");
n=1;
m=j;
while(l>1)
{m=m%i;
if(array[m].flag==0)
{if(n==k)
{printf("%4d", array[m].number);
array[m].flag=1;
n=1;
m++;
l--;
}
else n++, m++;
}
else m++;
}
printf("\nThe last number in the array:\n");
for(m=0; m<i; m++)
if(array[m].flag==0) printf("%d\n", array[m].number);
}
我的三组验证数据是:
(1)5 2 3
1 2 3 4 5
结果是:5 3 2 4
最后留下的:1
(2)10 3 5
1 2 3 4 5 6 7 8 9 0
结果是:8 3 7 5 2 1 4 7 0
最后留下的:6
(3)11 3 5
1 2 3 4 5 6 7 8 9 0 11
结果:8 2 7 3 0 6 5 9 1 4
最后留下:11

好现在开始给你们加分。
再次感谢大家!

sokoban 2002-06-15
  • 打赏
  • 举报
回复
用链表可以的!
cillin 2002-06-15
  • 打赏
  • 举报
回复
不好意思,没写完
m = 8时输出9 ,
然后从头开始,n = 1, m = 1;
当N = 4, M = 5 时,array[m].flog = 1;
//if( n == k&&array[m].flog == 0 ),
这样循环N次, 也不会再有输出了呀!!!
还有,
你不会DEBUG吗?
就算不会也可以笔算呀!
cillin 2002-06-15
  • 打赏
  • 举报
回复
当n == 4 时,
执行m++, m == 4;
print array[4].number = 5,你的结果怎么会是4?
然后, n = 1;
ynli2002 2002-06-15
  • 打赏
  • 举报
回复
to Woodman007(司空无情)

你的说法是错误的
j得到的是","的ascii值,而k得到的是1
Woodman007 2002-06-15
  • 打赏
  • 举报
回复
scanf("%d%d%d", &i, &j, &k); /* i为总的个数, j开始位置, k为离开位置 */
要这样输入: 10,1,4
ynli2002 2002-06-15
  • 打赏
  • 举报
回复
还有你这个根本不需要二重循环
式式改称如下形势
n=1;
for(m=j; m<i; m++)
{
  m=m%(i-1);
if (l<1) break;
  if(n==k&&array[m].flag==0)
{
printf("%4d", array[m].number);
array[m].flag=1;
    n=1;
l--;
}
else n++;
}
ynli2002 2002-06-15
  • 打赏
  • 举报
回复
当然只能打印两个数了
当m++的时候打印完第二个数之后m>10了
for(m=j; m<i; m++)
改称
for(m=j; m<i; m++)
{ m=m%(i-1);//或是m%i这与语言有关





fangrk 2002-06-15
  • 打赏
  • 举报
回复
这个问题我觉得用链表结构方便

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧