sgu 102 欧拉函数(poj 2407)

题意:给定一个整数n,求不大于n且与n互质的整数个数。

思路:欧拉函数(见poj2478Farey序列)。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int main(){
	int i,n,res;
	//freopen("a.txt","r",stdin);
	cin >> n;
	for(i = 2,res=n;i<=n;i++)
		if(n%i == 0){
			res = res/i*(i-1);
			while(n%i == 0)
				n /= i;		
		}
	cout <<res<<endl;
	return 0;
}

过了段时间同样的题(poj 2407)写成了这个样子:

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10000
int n,y[10000];
int main(){
    while(scanf("%d",&n) && n){
        int i,j,len = 1;
        if(n == 1){
            printf("1\n");
            continue;
        }
        j = n;
        for(i = 2;i*i<=j;i++)
            while(j%i == 0){
                if(i > y[len-1])
                    y[len++] = i;
                j /= i;
            }
        if(j!=1)
            y[len++] = j;
        for(i = 1;i<len;i++)
            n = n/y[i]*(y[i]-1);
        printf("%d\n",n);
    }
    return 0;
}

你可能感兴趣的:(sgu 102 欧拉函数(poj 2407))