知道了欧拉函数的计算公式以后,可以看出事实上是将数字的质因子分解出来求解,可以通过埃式筛的过程,每筛出一个素数,就将其所有倍数根据欧拉函数的计算式进行一次计算,在初始化的时候,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;
}