本篇文章用动态数组去储存灯的信息,基于C99的编译器也可以用一般数组就好了。
> 假设有 N 盏灯(N 为不大于 5000 的正整数),从 1到 N 按顺序依次编号,初始时全部处于开启状态;有 M 个人(M 为不大于 N 的正整数)也从 1 到 M 依次编号。第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的灯做相反处理。
> 请问:当第 M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入格式
输入正整数 N 和 M,以单个空格隔开,M≤N。
输出格式
顺次输出关闭的灯的编号,其间用逗号间隔。
样例输入
10 10
样例输出
1,4,9
//
#include<stdio.h>
#include<stdlib.h>
const int BLOCK_SIZE = 5;
typedef struct{
int *array;
int size;
}Array;
Array array_create(int init_size);
void array_free(Array *a);
int array_size(Array *a);
int *array_at(Array*a,int index);
void array_inflate(Array *a,int more_size);
void array_set(Array*a,int index,int value);
Array array_create(int init_size)
{
Array a;
a.size = init_size;
a.array = (int*)malloc(sizeof(int)*a.size);
return a;
}
void array_free(Array *a)
{
free(a->array);
a->array=NULL;
a->size=0;
}
int array_size(Array *a)
{
return a->size;
}
int *array_at(Array*a,int index)
{
if(index>=a->size)
{
array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE - a->size);
}
return &(a->array[index]);
}
void array_inflate(Array *a,int more_size)
{
int *p=(int*)malloc(sizeof(int)*(a->size +(more_size)));
for(int i=0;i<a->size;i++)
{
p[i]=a->array[i];
}
free(a->array);
a->array=p;
a->size+=more_size;
}
void array_set(Array*a,int index,int value)
{
a->array[index]=value;
}
int main()
{
Array a,b;
int num1,num2;
scanf("%d %d",&num1,&num2);
a = array_create(num1);
for(int i =0;i<num1;i++)
{
*array_at(&a,i) = 0;
}
for(int i=0;i<num1;i++)
{
for(int j=2;j<=num2;j++)
{
if((i+1)%j==0)
{
a.array[i]++;
}
}
}
if(a.array[0]%2==0)
{
printf("1");
}
for(int i =1;i<num1;i++)
{
if(a.array[i]%2==0)
{
printf(",%d",i+1);
}
}
array_free(&a);
return 0;
}