SHUOJ 指示灯控制

来源:互联网 发布:淘宝内部劵骗局 编辑:程序博客网 时间:2024/05/13 11:31

描述

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;}
原创粉丝点击