B - 结果填空:开关灯——计蒜客2018 蓝桥杯省赛 B 组模拟赛(一)

蒜头君今天回到了老家的大宅院,老家的灯还是那中拉线的灯(拉一次为亮,再拉一次就灭),蒜头君觉得无聊。把 1000盏灯 3的倍数拉了一次,5的倍数拉了一次,7的倍数拉了一次(灯得的编号从 1−1000
,灯的初始状态都是亮的)。这个时候蒜头君在想还剩下几盏灯还在亮着?
提示:请不要输出多余的符号。
我最开始的思路的解法:

#include<bits/stdc++.h>
using namespace std;
int a[1005];
int s=1000;
int main()
{
    for(int i=1;i<=1000;i++)
    {
        a[i]=i;
    }
    for(int i=1;i<=1000;i++)//是3的倍数灭,
    {
        if(a[i]%3==0)
            s--;
    }
    for(int i=1;i<=1000;i++)//是5的倍数但不是3的倍数,灭,
    {
        if(a[i]%5==0&&a[i]%3!=0)
            s--;
    }
    for(int i=1;i<=1000;i++)//是5的倍数也是3的倍数,亮,
    {
        if(a[i]%5==0&&a[i]%3==0)
            s++;
    }
    for(int i=1;i<=1000;i++)//是7的倍数但不是3和5的倍数,灭,
    {
        if(a[i]%7==0&&a[i]%3!=0&&a[i]%5!=0)
            s--;
    }
    for(int i=1;i<=1000;i++)//是7的倍数也是3的倍数但不是5的倍数,亮,
    {
        if(a[i]%7==0&&a[i]%3==0&&a[i]%5!=0)
            s++;
    }
    for(int i=1;i<=1000;i++)//是7的倍数也是5的倍数但不是3的倍数,亮,
    {
        if(a[i]%7==0&&a[i]%5==0&&a[i]%3!=0)
            s++;
    }
    for(int i=1;i<=1000;i++)//是7的倍数也是5的倍数也是3的倍数,灭,
    {
        if(a[i]%7==0&&a[i]%5==0&&a[i]%3==0)
            s--;
    }
    cout<<s<<endl;
    return 0;
}

简便解法:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int num=0;
	bool a[1005];
	for(int i=1;i<=1000;i++)
        a[i]=true;//初始状态  全部灯都亮着  true代表灯亮  false代表灯灭
	for(int i=1;i<=1000;i++)//依次遍历每盏灯
	{
		if(i%3==0)//是3的倍数
		a[i]=!a[i];//改变当前灯的状态  下同
        if(i%5==0)
        a[i]=!a[i];
        if(i%7==0)
        a[i]=!a[i];
        if(a[i])//该编号判断完毕  判断是否亮着
        num++;
	}
	cout<<num<<endl;
	return 0;
}

版权声明:本文为weixin_44641254原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。