AOJ.800 热身之开关灯

热身之开关灯

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;
    }
}
原文地址:https://www.cnblogs.com/pengwill/p/7367247.html