埃式筛求 1 到 n 的欧拉函数值

知道了欧拉函数的计算公式以后,可以看出事实上是将数字的质因子分解出来求解,可以通过埃式筛的过程,每筛出一个素数,就将其所有倍数根据欧拉函数的计算式进行一次计算,在初始化的时候,a[n] = n,如果在循环过程中遇到 a[i] = i 说明 i 没有其他因子,即 i 是素数,然后更新其倍数的欧拉函数值

#include <cstdio>
#include <cmath>
using namespace std;
int a[10010];
int main()
{
	int n = 100;
	for (int i = 1; i <= n; i++){
		a[i] = i;
	}
	for (int i = 2 ; i <= n; i++){
		if(a[i] == i){
			for (int j = i; j <= n; j += i){
				a[j] = a[j] / i * (i - 1);
			}
		}
	}
	for (int i = 0; i <= 100; i++){
		printf("%d\n", a[i]);
	}
	return 0;
}

 

posted @ 2019-08-20 09:56  correct  阅读(131)  评论(0)    收藏  举报