http://acm.hdu.edu.cn/showproblem.php?pid=2053
Problem Description
There are many lamps in a line. All of them are off at first. A series of operations are carried out on these lamps. On the i-th operation, the lamps whose numbers are the multiple of i change the condition ( on to off and off to
on ).
Input
Each test case contains only a number n ( 0< n<= 10^5) in a line.
Output
Output the condition of the n-th lamp after infinity operations ( 0 - off, 1 - on ).
Sample Input
1 5
Sample Output
1 0
方法1:
第n个灯只在n%i==0的时候变换状态,所以可以转换为求n的约数的个数,为奇数结果为1,为偶数结果为0.
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
int count=0;
for(i=1 ; i<=n ; i++){
if(n%i==0)count++;
}
if(count%2!=0)printf("1\n");
else printf("0\n");
}
return 0;
}
方法2:
1.对于任何一盏灯,由于它原来不亮,那么,开关被按奇数次时灯是亮着的,开关被按偶数次时灯是灭着的。 2.“一盏灯的开关被按的次数,恰等于这盏灯编号的约数个数”。求哪些灯还亮着,就是求哪些灯编号的约数个数是奇数个。显然,完全平方数有奇数个约数,所以用完全平方数编号的灯是亮着的。#include<stdio.h> #include<math.h> int main () { int n; double s; while(scanf("%d",&n) != EOF) { s = sqrt(n); if (fabs((int)s - s) <= 0.000001) printf("1\n"); else printf("0\n"); } return 0; }
另一种参考:#include<iostream> using namespace std; int a[100001]={0}; int main( ) { int n,i; for(i=1;i*i<=100000;i++) a[i*i]=1; while(cin >>n) cout <<a[n]<<endl; return 0; }