• 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;
        }
    }
    
  • 相关阅读:
    Spring笔记系列--1--基本内容与xml配置
    aop(面向切面编程)在Java中的两种动态代理实现
    linux配置网络,关闭防火墙命令操作
    Nginx知识记录
    发邮件工具类
    增强请求响应——代理模式
    取url中的参数值
    lumisoft会将eml后缀格式的附件给解析成文本,这里保存成文件
    lumisoft邮件头不规范造成内容无法读取
    lumisoft邮件内容中文乱码问题
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367247.html
Copyright © 2020-2023  润新知