热身之开关灯
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 276 Submission Accepted: 103
Description
吃完草莓以后,机房的小伙伴们要开始做些运动。在ACM实验室里有N盏灯编号为1到N,起初都是开着的,从第一盏灯开始,凡是编号是一的倍数的灯的开关都要被按一遍(亮的变成暗的,暗的变成亮的),
然后到第二盏灯,凡是编号是二的倍数的灯的开关都要被按一遍,一直到第N盏灯,凡是编号是N的倍数的灯都要被按一遍。那么问题来了,在灯质量比较好的情况下,最后还有多少盏灯是亮着的。
Input
题目包括多组输入
只有一行,这一行只有一个数N,1<=N<=1000
Output
输出一行,这一行也只有一个数,就是亮着灯的个数
Sample Input
3
Sample Output
2
Hint
经过第一个灯的时候1,2,3号灯都按了依次,经过第二个灯的时候,2号灯按了一次,经过第三个灯的时候,3号灯按了一次,最后只有2,3灯还亮着。
题意分析
用数组实现开关灯。首先用memeset把数组置为0代表开灯,然后用循环处理i的倍数,如果数组为0则变成1,最后遍历数组计数数组单元为0的个数。
代码总览
/*
Title:AOJ.800
Author:pengwill
Date:2016-11-14
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 1005
/*
NOTE: 1.如果是判断==0 写!()
2.如果判断!=0 直接写就行
*/
int lamp[maxsize];
void go(int * a);
int main()
{
int n,k;
int i,j,flag = 0,cnt = 0;
while(scanf("%d",&n) != EOF){
cnt = 0;
memset(lamp,0,sizeof(lamp));
for(i = 1;i<=n;++i){
for(j = i;j<=n;j+=i){
go(&lamp[j]);
}
}
for(i = 0;i<n;++i){
if(lamp[i] ==0 ){
cnt++;
}
}
printf("%d
",cnt);
}
return 0;
}
void go(int * a)
{
if(!*a ){
*a = 1;
}else{
*a = 0;
}
}