【问题标题】:Euler's totient function in CC语言中的欧拉函数
【发布时间】:2016-12-03 20:32:20
【问题描述】:

对于自然数 n,欧拉的总函数定义为集合 {1,...n} 中与 n 互质的自然数的个数。我必须用 C 语言编写一个程序,以便输入 n 的输出是 n 的欧拉函数。 这是我的尝试:

#include<stdio.h> 
int main(void) {

int n,k;

scanf("%d", &n);

for (k=1; k<n; k++) {
  if(n%k !=0) 

  printf("%d\n", k);

  }

return 0;

} 

后来我意识到这也应该给我1作为每个n的输出,所以我想我可以在return 0之前添加这个:

if(k=1) printf("1"); 

但这似乎不太好......我怎样才能更聪明地编写这个程序?

【问题讨论】:

  • if(k=1) ==> if(k==1)。但是你需要一个 GCD 函数please read
  • if(n%k !=0) 这不是检查 k 是否与 n 互质的方法。示例:n=16 和 k = 12。

标签: c loops primes


【解决方案1】:

Euler 的 totient 函数计算与 n 互质的正整数,直到给定整数 n 为止 link

您可以计算相对素数或互素数,如下所示:

int coprime(int a, int b)
{
    while(b)
    {
        a %= b;

        //swap a & b
        int temp = a;
        a = b;
        b = temp;
    }

    return a;
}

计算欧拉的Totient为:

int phi(int n)
{
    int result = 0;
    int k;
    for(k = 1; k <= n; k++)
        result += coprime(k, n) == 1;
    return result;
}

测试:

int main()
{
    int i;
    for(i = 1; i < 10; i++)
        printf("%d %d\n", i, phi(i));
    return 0;
}

结果(与other 结果比较)

1 1
2 1
3 2
4 2
5 4
6 2
7 6
8 4
9 6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2016-08-19
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多