杭电 2053 Switch Game

http://acm.hdu.edu.cn/showproblem.php?pid=2053

#include<stdio.h>
#include<string.h>
int a[100001];
int main(){
	int n,i,j;
	while(scanf("%d",&n) != EOF)
	{
		memset(a,0,sizeof(a));
		for(i = 1;i <= n;i++){
			for(j = i;j <= n;j+=i){
				if(j%i == 0) a[j] = !a[j];
			}			
		}
		printf("%d\n",a[n]);
	}
	return 0;
}

《算法竞赛入门经典》第35页类似的开灯问题

题目: 有n盏灯,编号为1~n.第一个人把所有的灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关),第3个人按下所有编号为3 的倍数的开关(开着的灯关掉,关着的灯被打开),以此类推,一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯的编号。k<=n<=1000

 样列输入: 7 3
 样列输出: 1 5 6 7

#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
int a[MAXN];
int main()
{
    int i,j,n,k,first = 1;
    memset(a,0,sizeof(a));
    scanf("%d%d",&n,&k);
    for(i = 1; i <= k; i++)
        for(j = 1; j <= n; j++)
            if(j % i == 0)
            {
                a[j] = !a[j];
            }
    for(i = 1; i <= n; i++)
        if(a[i])
        {
            if(first)
            {
                first = 0;
            }
            else
            {
                printf(" ");
            }
            printf("%d",i);
        }
    printf("\n");
    return 0;
}
设置标志变量first,表示当前要输出的变量是否为第一个,第一个变量前不应有空格,但其它都有。

猜你喜欢

转载自blog.csdn.net/u012102588/article/details/18939627