【问题标题】:Printing the Largest Prime Factor of a Composite Number in C在 C 中打印合数的最大素数
【发布时间】:2010-08-12 16:30:12
【问题描述】:

我正在解决一个难题,我需要找到用户输入的合数的最大素因数。 我想到了一些东西并尝试了它,但是它无法检测到合数因子中最大的素因子。

我在下面附加我的代码,如果有人能在这里帮助我检测最大的素数,我将不胜感激。在这些因素中并打印出来。

// Accept a composite number from user and print its largest prime factor.

#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=2; j<=i/2; j++) //since a numbr cand be divisible by a number greated than its half
            {               if(i%j > 0) 
                    b = i;
                else if(i==3)
                    b = 3;
            }
        }
    }
    printf("%d\nLargest prime factor: %d\n", c, b);
}

【问题讨论】:

  • 我不明白。做这样的谜题的目的是让获得编写代码来解决问题的技能。让别人去做是完全没有意义的。

标签: c numbers primes composite


【解决方案1】:

诀窍是,找到最小的素因数,将合数c除以它,得到最大的素因数。

诀窍是找到最小因子 F(从 2 开始),其中 C / F 是素数。那么,C / F 将是 C 的最大素因子。

编辑:您似乎还想列出所有因素。问题是,在您测试素数的内部循环中,您将最大素数设置为 i 以表示可以被任何东西整除的数字。换句话说,尝试这样的事情:

is_prime = true;

for (j = 2; j <= x / 2; j++) {
    if (i % j == 0)
        is_prime = false;
}

if (is_prime)
    largest_prime = x;

请注意,您实际上可以在 x 除以 2 之前停止。您可以在 x 的平方根处停止。但是,&lt;math.h&gt; 中的 sqrt() 函数在您的情况下使用起来有点混乱,因为它适用于浮点数,而不是整数。

【讨论】:

  • 这只是找到最大的因子,因为最小的因子总是素数。
  • 而不是 j
【解决方案2】:

要找到素数分解,您通常会找到 2 和 sqrt(N) 之间的所有因数。您将复合除以其中的每一个以获得其余因素。然后递归找出每一个的质因数。

完成后,您将获得所有主要因素的列表。获取列表中最大的项目应该是相当简单的。

【讨论】:

  • “然后递归找出每个质因数”——这听起来不对
  • 我认为他的意思是递归地应用以得到结果较小数字的更多因子。例如,如果输入是 52,则可以取出 2,而 26 仍然可以取出另一个 2,因为 52 = 4 X 13 和 4 = 2 X 2。
  • @JB:是的——这就是我的想法。当我坐下来想一想时,我并不完全确定这是做事的正确方式,但无论如何这就是我的想法......
【解决方案3】:

在您的内部循环中,如果存在确实存在一个 不是i 的因子的数字,则您正在设置 b = i。如果存在一个i的因子的数字,则需要设置b = i

(当然,“数字”是指“2sqrt(i) 之间的整数”)

【讨论】:

    【解决方案4】:

    因式分解是一个经典的数论问题。您可以在数论教科书中找到许多分解算法。其中一些可在 wiki http://en.wikipedia.org/wiki/Integer_factorization

    上找到

    【讨论】:

      【解决方案5】:

      嘿,感谢输入的朋友,我计算了一些东西,现在程序打印合数的最大素因数,前提是合数小于 52,而对于高于此的更高范围,它不会打印正确的输出。 我正在附加代码,请看看你们是否可以帮助我

      #include<stdio.h>
      

      空主() { 诠释 i,j,b=2,c; printf("\n请输入一个合数:"); scanf("%d", &c); printf("因素:");

      for(i=1; i<=c/2; i++)
      {
          if(c%i==0)
          {
              printf("%d ", i);
              for(j=1; j<=i; j++) //since a numbr cand be divisible by a number greated than its half
              {               if(i%j > 0)
                      b = i; //b stores the largest prime factor
                  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)当合数小于 52 时(我可以说当前代码处理这种情况)2)当合数是大于 52 ,小于 100 (本例未编码)如果有人能说明第二部分的代码,那就太好了!
      【解决方案6】:

      在 Python 中,可以这样做:

      import math
      import itertools
      
      # largest prime factor of a composite number
      def primality(num):
          for i in range(2,int(math.sqrt(num))+1):
              if num%i ==0:
                   return 0
          return 1
      
      if __name__ == '__main__':
          number = 600851475143
          for i in itertools.count(2,1):
                  if number%i == 0:
                      if number%10 in [7,9,1,3] and primality(number/i):
                          print number/i
                          break
      

      我用来检查素数的是整洁的平方根技术。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 2021-07-17
        • 2019-10-17
        • 1970-01-01
        相关资源
        最近更新 更多