浙江理工大学入队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;
}
本文来自博客园,作者:shany212,转载请注明原文链接:https://www.cnblogs.com/codeshany/p/zstu_200_18G.html