NYOJ 479 (数的互质)

参考:http://en.wikipedia.org/wiki/Euler%27s_totient_function

View Code
 1 #include<stdio.h>
2
3 int main()
4 {
5 int n,i;
6 bool flag;
7 while(scanf("%d",&n) != EOF)
8 {
9 int t=n;
10 for(i=2;i<=t;++i)
11 {
12 flag=0;
13 if(t%i==0)
14 {
15 flag=1;
16 while(t%i==0)t/=i;
17 }
18 if(flag)n=n/i*(i-1);//就是 n * (1-1/i) 因为上面已经验证 t%i==0所以 n 是 i 的倍数
19 }
20 printf("%d\n",n);
21 }
22 return 0;
23 }

 

 

自己的:

View Code
 1 #include<stdio.h>
2 #include<string.h>
3
4 int flag[10010];
5
6 int main()
7 {
8 int i,n,j;
9 while(EOF != scanf("%d",&n))
10 {
11 memset(flag,0,sizeof(flag));
12 int num = n-1;
13 for(i=2;i<n;++i)
14 {
15 if(flag[i])continue;
16 if(n%i==0)
17 {
18 for(j=i;j<n;j+=i)
19 {
20 if(flag[j]==0)
21 {
22 num--;
23 flag[j]=1;
24 }
25 }
26 }
27 }
28 if(1==n)num=1;
29 printf("%d\n",num);
30 }
31 return 0;
32 }

 

posted @ 2012-04-04 15:19  知行执行  阅读(181)  评论(0编辑  收藏  举报