这是欧拉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;
}
}
答案 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;
}