为什么它只被执行了一次

时间:2022-05-19 17:52:55
我编了这样一个程序用来实现约瑟夫问题:
#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被打印了出来呢?

9 个解决方案

#1


这个问题我觉得用链表结构方便

#2


当然只能打印两个数了
当m++的时候打印完第二个数之后m>10了
for(m=j; m<i; m++)
改称
for(m=j; m<i; m++)
{ m=m%(i-1);//或是m%i这与语言有关
  :
  :

  

#3


还有你这个根本不需要二重循环
式式改称如下形势
   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++;
   }

#4


scanf("%d%d%d", &i, &j, &k); /* i为总的个数, j开始位置, k为离开位置 */ 
  要这样输入:   10,1,4

#5


to Woodman007(司空无情) 

你的说法是错误的
j得到的是","的ascii值,而k得到的是1

#6


当n == 4 时,
执行m++, m == 4; 
print array[4].number = 5,你的结果怎么会是4?
然后, n = 1; 

#7


不好意思,没写完
m = 8时输出9 ,
然后从头开始,n = 1, m = 1;
当N = 4, M = 5 时,array[m].flog = 1;
//if( n == k&&array[m].flog == 0 ), 
这样循环N次,  也不会再有输出了呀!!!
还有, 
你不会DEBUG吗?
就算不会也可以笔算呀!

#8


用链表可以的!

#9


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

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

#1


这个问题我觉得用链表结构方便

#2


当然只能打印两个数了
当m++的时候打印完第二个数之后m>10了
for(m=j; m<i; m++)
改称
for(m=j; m<i; m++)
{ m=m%(i-1);//或是m%i这与语言有关
  :
  :

  

#3


还有你这个根本不需要二重循环
式式改称如下形势
   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++;
   }

#4


scanf("%d%d%d", &i, &j, &k); /* i为总的个数, j开始位置, k为离开位置 */ 
  要这样输入:   10,1,4

#5


to Woodman007(司空无情) 

你的说法是错误的
j得到的是","的ascii值,而k得到的是1

#6


当n == 4 时,
执行m++, m == 4; 
print array[4].number = 5,你的结果怎么会是4?
然后, n = 1; 

#7


不好意思,没写完
m = 8时输出9 ,
然后从头开始,n = 1, m = 1;
当N = 4, M = 5 时,array[m].flog = 1;
//if( n == k&&array[m].flog == 0 ), 
这样循环N次,  也不会再有输出了呀!!!
还有, 
你不会DEBUG吗?
就算不会也可以笔算呀!

#8


用链表可以的!

#9


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

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