小小bai遇到一道比较绕的题目
作者:互联网
有n个人围成一圈,顺序从零排号。从第一个人开始报数(从1到3报数),
凡报到3的人 退出圈子,问最后留下的是原来第几号的那位。
a[4] = {1, 2, 3, 4,};
小白的思路是这样:
【1】/* 使用一个计数器,一个用来计总共经过多少次,逢3变0
【2】变0的同时,将其值变为0的数移动到最后一个(使用冒泡排序一步步交换到后面)
【3】 还有一个变量n记录数组的长度,每次清零用来记录数组内的个数,每经过一次步骤【2】数据内减一 ,让每次循环都变成只有n个数内部循环
*/
代码如下
#include<stdio.h>
void swap_delete(int array[],int n,int m);
void swap(int *p1,int *p2);
void show(int array[]); //打印出数字
int main(void)
{
int a[4] = {1, 2, 3, 4};
int n=3;
int counts2=1;
int i;
//counts2从1开始
show(a);
// 每次循环内部,i要不断从0数到最后的数字n,每经过一次步骤【2】数据内减一
while(n)
{
for(i=0;i<=n;i++)
{
if(counts2%3==0)
{
counts2=counts2%3;
//将i对应的值变为0并交换到后面,n的值减一;
a[i]=0;
swap_delete(a,i,3);
n--;
}
counts2++;
}
}
show(a);
return 0;
}
void swap_delete(int array[],int n,int m)
{
int i;
for(i=n;i<m;i++)
swap(&array[i],&array[i+1]); //i+1=m
}
void swap(int *p1,int *p2)
{
int mid=*p1;
*p1=*p2;
*p2=mid;
}
void show(int array[])
{
int i;
for(i=0;((i<4)&&(array[i]!=0));i++)
printf("%d ",array[i]);
printf("\n");
}
第一种情况
当n从3开始,数组内部有4个数,每次counts从1开始到0(也就是3)结束
结果出现这个
对结果进行调试
‘
第二次修改
当n从4开始,数组内部有4个数,每次counts从1开始到0(也就是3)结束
程序修改如下
调试结果如下
呈现这结果况
第三次修改
当n从4开始,数组内部有4个数,每次counts从1开始到0(也就是3)结束,(循环共计3次)最终总的程序在n=1时结束
调试结果最终终于成功
标签:小小,题目,int,void,个数,每次,数组,counts,bai 来源: https://blog.csdn.net/HEIS1HE/article/details/123248505