如何纠正我的代码中的错误以找到Euler的Totient。有人可以纠正我遇到错误的部分吗?

时间:2019-10-03 07:03:35

标签: c

这是欧拉Totient的例子。输入n的Euler的Totient函数?(n)是{1、2、3,…,n}中相对于n素数的数字的计数,即GCD(最大公约数)的n为1的数字。 我对main()函数感到震惊。根据我的直觉,它应该计算每对gcd的总和,每个数字等于1。

进入hcf函数时,输出将无限次迭代。如果删除hcf函数只是为了检查该函数采用的对是否正确,它会以正确的顺序打印它们。但是,如果我在主函数中添加hcf(),它将进入无限循环,而不是打印等于1的对的gcd的总和。

     #include<stdio.h>
      int temp,a,b,n,sum=0,i,j, gcd;

        int hcf(a,b)
        {    for(i=1; i <= a && i <= b; i++)
             {
                 if(a%i==0 && b%i==0)
                     gcd = i;
             }
                 return gcd;
        }


        void main()
        {
           printf("Enter the value of n");
           scanf("%d",&n);
           for(i=1;i<=n;i++)
           {
               for(j=1;j<=i;j++)
               {
                   printf("%d,%d\n",j,i);
                   if(hcf(j,i)==temp)
                       {
                           sum=sum+1;
                       }

                }
                printf("%d\n",sum);
                sum=0;

           }

        }

1 个答案:

答案 0 :(得分:1)

根本原因分析:

问题是您要在两个位置递增i(具有 global 范围):1.在main中进行循环。 2. for hcf中的循环。结果是j中的for循环中的main从未达到i,您将得到一个无限循环。


解决方案说明:

可能的更正是将i的范围限制在hcf内:

#include "stdio.h"

int temp,a,b,n,sum=0,i,j, gcd;


int hcf(int a, int b)
{
    int i;
    for (i = 1; i <= a && i <= b; i++)
    {
        if (a % i == 0 && b % i == 0)
            gcd = i;
    }
    return gcd;
}


int main()
{
    printf("Enter the value of n");
    scanf_s("%d", &n);
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d,%d\n", j, i);
            if (hcf(j, i) == temp)
            {
                sum = sum + 1;
            }

        }
        printf("%d\n", sum);
        sum = 0;
    }

    return 0;
}