2464 - 【数组】开门问题(例题)

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

        例5.3     宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)

 

题目输入

无输入。

 

题目输出

从小到大输出开着门的房间编号,中间用一个空格分隔,行尾不能有空格。

 

输入/输出样例

输入格式

no input needed

输出格式

1 4 9 16 25 36 49 64 81 100

C语言解答

#include<stdio.h>
#include<string.h>
int a[1000];
int main()
{
	int i,j,l=0;
	
	memset(a,0,sizeof(a));
	for(j=1;j<=100;j++)
	{
	
	for(i=1;i<=100;i++)	

	if(i%j==0)
	{
	a[i]=!a[i];
	}}
	for(i=1;i<=100;i++)
	{
	if(a[i]!=0)
	{
		l++;
		if(l==1)printf("%d",i);
		if(l>1)printf(" %d",i);
	}}
	return 0;
}

C++解答

#include<cstdio>
#include<cstring>
#include<cstdio>
#define MAXN 100+10
int a[MAXN];
int main()
{
	int k,n,first;
	first=1;
	memset(a,0,sizeof(a));
	for (int i=1;i<101;++i)
		for (int j=1;j<=100;++j)
			if (j%i==0) a[j]=!a[j];
	for (int i=1;i<=100;++i)
		if (a[i])
		{
			if(first) first=0; 
				else printf(" ");
			printf("%d",i);  
		}
	printf("\n");
	return 0;	
}

Java解答

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		String s="";
		int[] a=new int[100];
		for(int i=0;i<100;i++){
			a[i]=1;
		}
		for(int i=2;i<=100;i++){//2 3 4 倍
			for(int j=1;j<=100;j++){
				if(j%i==0){
					a[j-1]=-a[j-1];
				}
			}
		}
		for(int i=0;i<100;i++){
			if(a[i]==1){
				s+=i+1+" ";
			}
		}
		System.out.println(s.trim());
	}
}

Python解答

# coding=utf-8
lst1=list(range(1,101))
lst2=[False]*100
for i in range(1,101):
    for j in range(1,101):
        if lst1[j-1]%i==0:
            lst2[j-1]=not lst2[j-1]
for i in range(1,101):
    if lst2[i-1]:
        print(lst1[i-1],end=" ")