n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针”一二”报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。
输入
不超过1000组数据。
每组数据一行,每行一个正整数,代表人数n。 (1 <= n <= 1000)
输出
每组输入数据输出一行, 仅包含一个整数,代表最后剩下的人的编号。
用队列写,本人的代码是:
#include <stdio.h>
#include <malloc.h>
static int *arr=NULL;
static int count;
int create_array_queue(int sz)
{
arr = (int *)malloc(sz*sizeof(int));
if (!arr)
{
printf(“arr malloc error!”);
return -1;
}
count = 0;
return 0;
}
int destroy_array_queue()
{
if (arr)
{
free(arr);
arr = NULL;
}
return 0;
}
void add(int val)
{
arr[count++] = val;
}
int front()
{
return arr[0];
}
int pop()
{
int i = 0;
int ret = arr[0];
count–;
while (i++<count)
arr[i-1] = arr[i];
return ret;
}
int size()
{
return count;
}
int is_empty()
{
return count==0;
}
int cal( int n)
{
int i,count,a;
for(i=1;i<=n;i++)
add(i);
count=0;
while(size()>1)
{
count=count+1;
if(count%2==0)
pop();
else
a=front();
pop();
add(a);
}
return front();
}
int main(void)
{
int n;
scanf(“%d”,&n);
cal(n);
printf(“%d”,front());
return 0;
}
本人的想法是这样的:通过主函数调用函数功能,完成分函数后再将求出的编号返回至主函数并显示出来,可为什么用VC运行的时候输入n后,没有反应。
20
#include <stdio.h> #include <malloc.h> static int *arr=NULL; static int count; int create_array_queue(int sz) { arr = (int *)malloc(sz*sizeof(int)); if (!arr) { printf("arr malloc error!"); return -1; } count = 0; return 0; } int destroy_array_queue() { if (arr) { free(arr); arr = NULL; } return 0; } void add(int val) { arr[count++] = val; } int front() { return arr[0]; } int pop() { int i = 0; int ret = arr[0]; count--; while (i++<count) arr[i-1] = arr[i]; return ret; } int size() { return count; } int is_empty() { return count==0; } int cal( int n) { int i,count,a; for(i=1;i<=n;i++) add(i); count=0; while(size()>1) { count=count+1; if(count%2==0) pop(); else a=front(); pop(); add(a); } return front(); } int main(void) { int n; scanf("%d",&n); create_array_queue(n); cal(n); printf("%d",front()); return 0; }
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
20
10
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列, //然后继续从1开始数数,数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() { while (1) { printf("Input n m(1000>=n>=m>=1):"); fflush(stdout); rewind(stdin); if (2==scanf("%d%d",&n,&m)) { if (1000>=n && n>=m && m>=1) break; } } t=0;//已出圈总人数 i=1;//座位编号 k=1;//当前要数的数 while (1) { if (0==f[i]) { if (m==k) { t++; f[i]=1; printf("%3d ",i); if (0==t%10) printf("\n"); if (t>=n) break; } k++;if (k>m) k=1; } i++;if (i>n) i=1; } cprintf("Press any key ..."); getch(); }
10