我接受一个合数作为输入。我想打印它的所有因子以及该数字的最大质因子。我已经编写了以下代码。一直到数字 51 都可以正常工作。但是如果输入任何大于 51 的数字,就会显示错误的输出。我该如何更正我的代码?

#include<stdio.h>
void main()
{
 int i, j, b=2, c;
 printf("\nEnter a composite number: ");
 scanf("%d", &c);
 printf("Factors: ");

 for(i=1; i<=c/2; i++)
 {
  if(c%i==0)
  {
   printf("%d ", i);
   for(j=1; j<=i; j++)
   {
    if(i%j > 0)
    {
     b = i;
    }
    if(b%3==0)
     b = 3;
    else if(b%2==0)
     b = 2;
    else if(b%5==0)
     b = 5;
   }
  }
 }
 printf("%d\nLargest prime factor: %d\n", c, b);
}

最佳答案

这有点剧透,所以如果你想自己解决这个问题,请不要阅读:)。我会尝试按先后顺序提供提示,以便您可以按顺序阅读每个提示,如果需要更多提示,请移至下一个提示等。

提示 #1:
如果除数是 n 的除数,则 n/除数也是 n 的除数。例如,100/2 = 50 余数为 0,所以 2 是 100 的约数。但这也意味着 50 是 100 的约数。

提示 #2
给定提示#1,这意味着我们可以在检查质因数时从 i = 2 循环到 i*i

100 / 2 = 50, so 2 and 50 are factors
100 / 5 = 20, so 5 and 20 are factors
100 / 10 = 10, so 10 is a factor

提示 #3
由于我们只关心 n 的素因数,所以只要找到 n 的第一个因数就足够了,称之为除数,然后我们可以递归地找到 n/除数的其他因数。我们可以使用 sieve 方法并在找到因素时标记它们。

提示 #4 C 中的示例解决方案:
bool factors[100000];

void getprimefactors(int n) {
  // 0 and 1 are not prime
  if (n == 0 || n == 1) return;

  // find smallest number >= 2 that is a divisor of n (it will be a prime number)
  int divisor = 0;
  for(int i = 2; i*i <= n; ++i) {
    if (n % i == 0) {
      divisor = i;
      break;
    }
  }
  if (divisor == 0) {
    // we didn't find a divisor, so n is prime
    factors[n] = true;
    return;
  }

  // we found a divisor
  factors[divisor] = true;
  getprimefactors(n / divisor);
}

int main() {
  memset(factors,false,sizeof factors);
  int f = 1234;
  getprimefactors(f);
  int largest;
  printf("prime factors for %d:\n",f);
  for(int i = 2; i <= f/2; ++i) {
    if (factors[i]) {
      printf("%d\n",i);
      largest = i;
    }
  }
  printf("largest prime factor is %d\n",largest);
  return 0;
}

输出:
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
prime factors for 1234:
2
617
largest prime factor is 617
> Terminated with exit code 0.

关于c - 在c中找到合数的最大质因数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3470781/

10-09 02:45