加载中...

浙江理工大学入队200题——18G

问题 G: 醉酒的狱卒1014

题目描述

某个监狱的大厅里有n个牢房,每个牢房彼此相邻。每个牢房都有一个囚犯,每个牢房都被锁上了。一天晚上,狱卒感到无聊并决定玩游戏。第一轮比赛,他喝了一杯威士忌,然后跑到大厅里打开每个牢房。第2轮,他喝了一杯威士忌,然后跑到大厅里把其他所有牢房(牢房2,4,6,...)锁上。对于第3轮,他喝了一杯威士忌,然后跑到大厅,他每三个牢房操作一次(l牢房3,6,9,......)。如果牢房被锁住,他会将其打开; 如果它被打开了,他会把它锁上。他重复了n轮,最后喝了一杯,然后昏倒了。一些囚犯,可能是零,意识到他们的牢房被打开,狱卒无法行动。他们立即逃脱。给你牢房的数量,确定有多少囚犯逃离监狱。

输入

第一行输入包含一个正整数。表示后面输入的行数。以下每行包含一个5到100之间的整数,表示有n个牢房。

输出

对于每一行,您必须打印出监狱有n个牢房时逃脱的囚犯数量。

样例输入 Copy

2
5
100

样例输出 Copy

2
10

题解

这道题跟之前的开灯问题一摸一样,开灯问题见>https://www.cnblogs.com/codeshany/p/zstu_200_9K.html<
应该算是一种复习吧。

代码(AC)

点击查看代码
#include<stdio.h>
int main()
{
	int t;
	scanf("%d",&t);//2
	for(int i=1;i<=t;i++)
	{
		int n;
		scanf("%d",&n);//t=5
		int a[1000];//0 1 2 3 4 
		for(int i=1;i<=n;i++)
		{
			a[i]=-1;
		}
		int j;
		for(int i=1;i<=n;i++)
		{
			for(j=i;j<=n;j=j+i)
			{
				a[j]=a[j]*(-1);
			}
		}
		int sum=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==1) sum++;
		}
		printf("%d\n",sum);
	}
	return 0;
}
posted @ 2022-10-30 14:14  shany212  阅读(74)  评论(0编辑  收藏  举报