SHUOJ 指示灯控制

描述

m盏灯排成一排,从1到m按顺序依次编号。有n个人也从1到n依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯做相反的处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将它打开)。以后的人都和3号一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。
你的任务是当第N个人操作之后,计算关着灯的数目。

输入
有若干组数据,每组是一行上的两个整数m,n(1<=m,n<=1000)。

输出
对每组数据m,n,输出关着灯的数目。

我的想法

这道题目的思路很简单,只是将m盏灯设置一个初始状态位0,如果对灯有操作则将它的状态位取反,最后统计看看有多少状态是1的灯就好了。
话虽是这么说,然而在我在具体实现的过程中出现了一个小问题。就是我们可以

int a[10]={0};

而不能

int a[m]={0};

即使m已经被赋值。然后经过我多(pin)方(ming)查(ctrl)证(F)最终找到了解释

C语言的数组长度必须是确定的,若要求是变量则需要使用内存动态分配函数

学习了一个,感到十分对不起C语言老师。

代码

#include<stdio.h>
int main()
{
    int m,n;
    int i,j;
    while(scanf("%d %d",&m,&n)==2)
    {
        int a[m+1];
        for(i=0;i<=m;i++)
            a[i]=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(j%i==0)
                a[j]=!a[j];
            }
        }
        int cnt=0;
        for(i=1;i<=m;i++)
        {
            if(a[i]==1)
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/waveviewer/article/details/77016968
今日推荐