1.有n个小孩围成一圈,对小孩进行1-n的编号,从编号为m的小孩开始从1到k重复报数,报道数字k的小孩出列,问小孩子的出列顺序以及最后剩下的小孩子编号是多少?
#include<stdio.h>
int main(){
printf("请输入小孩子的个数");
int n = 0;
scanf("%d",&n);
int m = 0;
printf("请输入从哪个编号的小孩开始:");
scanf("%d",&m);
printf("请输入报到多少次:");
int k = 0;
scanf("%d",&k)
int a[n]; //保存小孩子的数组
int i = 0;
for(i=0;i<n;i++){
a[i]=0; //a[i]==1代表出列,反之表示没出列
}
int report=0; //报数 1.2.3....k
int index=(m-1)%n; //因为index记录的是下标的位置!
int childOut=0; //记录出去的小孩子
while(childOut<n-1){ //最后只会剩下一个小孩子
if(a[index]==0){ //表示小孩子没出列
++report; //报数
if(report==k){
a[index]=1; //表示编号为index+1的小孩出列
++childOut; //出列的小孩个数+1
report=0; //重新报数
printf("%d",index+1); //出列的小孩子编号为:index+1
}
}
++index; //无论小孩子出列与否,报数是一直在进行的,编号一直+1.
if(index>=n){
index=0;
}
}
int i = 0 ;
for(;i<n;i++){
if(a[i]==0){
printf("最后一个学生的编号为:%d\n",i+1);
break;
}
}
return 0 ;
}
2.螺旋数组
例如:
n = 3:
1 2 3
8 9 4
7 6 5
#include<stdio.h>
int main(){
printf("请输入数组维度:")
int n = 0 ;
scanf("%d",&n);
int dir=0; //表示方向,0表示向右,1表示向下,2表示向左,3表示向上
int num=1;
int a[n][n];
int i = 0;
int j = 0;
for(;i<n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int i = 0 ,j = 0 ;
while(num<=n*n){
a[i][j]=num++;
switch(dir%4){
case 0 :
++j;
if(j+1>=n||a[i][j+1]!=0){
dir++; //改变方向
}
break;
case 1 :
++i
if(i+1>=n||a[i+1][j]!=0){
dir++; //改变方向
}
break;
case 3 :
--j;
if(j-1<=n||a[i][j-1]!=0){
dir++; //改变方向
}
break;
case 4 :
--i;
if(i-1<=n||a[i-1][j]!=0){
dir++; //改变方向
}
break;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d",a[i][j]);
}
}
return 0 ;
}