• 开灯问题


    开灯问题

    n盏灯,第1个人全部打开,后面的人按下自己序号倍数的灯的开关(改变灯状态),一共k个人。输入n,k,输出开着的灯的编号。k<=n<=1000。

    样例输入    7 3     样例输出   1 5 6 7

    ①我的程序

    #include<iostream>
    #define maxn 1010
    int a[maxn];
    using namespace std;
    int main(void)
    {
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<maxn;i++)
    a[i]=1;
    for(int j=2;j<=k;j++)
    for(int t=2;t<=n;t++)
    {
    if(t%j==0) a[t-1]++;
    }
    for(int m=0;m<n;m++)
    {
    if(a[m]%2!=0) printf("%d ",m+1);
    else continue;
    }
    return 0;

    }

     测试

     试试其他数据

    ②例题答案

    #include<iostream>
    #include<string.h>
    #define maxn 1010
    int a[maxn];
    using namespace std;
    int main(void)
    {
    int n,k,first=1;//标识变量first——表示当前要输出的变量是否为第一个。第一个变量前不应有空格,但其他变量有
    memset(a,0,sizeof(a));//数组清零 ,在string.h中定义
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++)
    for(int j=1;j<=n;j++)
    if(j%i==0) a[j]=!a[j];//a[j]=!a[j]来改变状态
    for(int i=1;i<=n;i++)
    if(a[i]) {
    if(first) first=0;
    else printf(" ");
    printf("%d",i);
    }
    printf(" ");
    return 0;
    }

    值得学习改正的地方

    首先,用标识变量first来控制输出格式,保证输出的第一个数据前没有空格,同时最后一个数据后直接回车 ,没有多余的空格,输出格式标准。

    同时,改变状态用a[j]=!a[j],比自己的程序中改变一次状态即加一,最后根据对应序号是奇数还是偶数巧妙。

    用string.h中的memset函数将数组清零:memset(a,0,sizeof(a));

  • 相关阅读:
    C#学习-类型转换
    《学习之道》第八章总结
    《学习之道》第八章有了待办清单,重要的是说做就做
    《学习之道》第八章学习方法27薪水
    《学习之道》第八章行动日志是第二双眼睛
    C#学习-接口与抽象类
    C#学习-显式接口
    《学习之道》第八章再次提到休息
    《学习之道》第八章执行日志的经验
    4..8矩阵的乘法运算
  • 原文地址:https://www.cnblogs.com/slay/p/9332485.html
Copyright © 2020-2023  润新知