可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合 scanf 函数逐个对数组元素赋值。
求解问题:100人围坐一圈并按顺时针方向依次编号为0,1,...,99。并沿顺时针方向依次报数1,2,3,...k。报数为k的人退出。剩下的人继续从1开始报数。最后留下的是几号?k从键盘输入。
输入:3
输出:90
【案例分析】
求解问题的基本思路是:
1、用数组作删除标记:int a[100]={0};
2、未作删除标记的编号循环报号,报到k的编号i作删除标记:a[i]=1;
3、每作一个删除标记,人数减1。直到余下最后一人。
【参考代码】
main()
{ int i=0,h=0,n=100,k,a[100]={0};
scanf("%d",&k);
while(n>1) //人数n>1时,继续报号
{ if(a[i]==0) //编号i未作删除标记
{ h++; //报号
if(h==k){h=0;a[i]=1;n--;} //报到k号,作删除标记
}
i=(i+1)%100; //下一个编号
}
for(i=0;i<100;i++) //找出未作删除标记的编号
if(a[i]==0){printf("%d",i);break;}
}
/*方法二思路:退出1个人后从其后的人开始重新编号0,1,...
则编号x的上一个编号为(x+k)%n(n为当前编号时的总人数+1)。
问题转化为:最后余下的编号0的起始编号是多少?
参考代码:
main()
{ int i,k,s=0;
scanf("%d",&k);
for(i=1;i<100;i++)
s=(s+k)%(i+1);
printf("%d",s);
}*/
评论列表