THE DRUNK JAILER

http://poj.org/problem?id=1218

开关门问题,初始化门(编号1~n)都是关着的,改变状态为开变关、关变开:  第1遍,全部改变状态;第2遍,编码2的倍数的门改变状态; 第3遍,编码3的倍数的门改变状态

……第n遍,编码n的倍数的门改变状态;

结束后,有多少扇门是开着的

法一:

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int t, n, i, j ;
 6     int a[110] ;
 7     scanf("%d", &t) ;
 8     while(t--)
 9     {
10         scanf("%d", &n) ;
11         memset(a, 0, sizeof(a)) ;//初始化,0代表门关着
12         for(i=1; i<=n; i++)
13         {
14             for(j=1; j<=n; j++)
15             {
16                 if(j%i==0)
17                 a[j] = !a[j] ;//取相反状态
18             }
19         }
20         int count = 0 ;
21         for(i=1; i<=n; i++)
22         {
23             if(a[i]!=0)
24             count++ ;
25         }
26         printf("%d\n", count) ;
27     }
28     return 0 ;
29 }

法二:求约数个数为奇数的数的个数,简单来说就是求n以内(含n)完全平方数的个数

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 int main()
 5 {
 6     int t, n, i, x ;
 7     int a[110] ;
 8     a[5] = 2 ;
 9     for(i=6; i<=100; i++)//打表
10     {
11         x = (int)(sqrt(i)) ;
12         if(x*x==i)
13         a[i] = a[i-1] + 1 ;
14         else
15         a[i] = a[i-1] ;
16     }
17     scanf("%d", &t) ;
18     while(t--)
19     {
20         scanf("%d", &n) ;
21         printf("%d\n", a[n]) ;
22     }
23     return 0 ;
24 }

 

posted @ 2013-04-10 14:57  yelan@yelan  阅读(166)  评论(0编辑  收藏  举报