找到给定整数的最大素数因子

时间:2013-04-27 08:47:43

标签: c

我正试图找到用户输入数字的最大素数因子。

到目前为止我已经:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int N;
    printf("Enter a positive number: ");
    scanf("%d", &N);
    int divisor = 1;

    for (int i = 2; i <= N; i++){
        if (N % i == 0){
            for (int j = 2; j < i; j++){
                if (i % j == 0 && j != i){
                    break;
                }
                else{
                divisor = i;
                }
            }
        }
    }
    printf("%i\n", divisor);
    return EXIT_SUCCESS;
}

但这似乎不起作用。我试图首先理解为什么上述方法不起作用,而不是尝试不同的方法。

上述代码应该迭代所有可能的素因子,首先检查用户输入的数字i是否可以设想,然后检查我是否是素数,然后重复整个过程以查看是否存在更大的素数这可能是一个因素。然而,它不起作用,因为它总是返回用户输入的数字N ,因为它有时会给出一个素数因子,大多数时候会返回N或其他一些非素数。

7 个答案:

答案 0 :(得分:2)

for (int i = 2; i <= N; i++){ // outer loop
    if (N % i == 0){
        for (int j = 2; j < i; j++){ // inner loop
            if (i % j == 0 && j != i){
                break;
            }
            else{
            divisor = i;
            }
        }
    }
}

在外环i的最后一次迭代中,等于N。条件(N % i == 0)true。我们处在内循环中。某些j条件(i % j == 0 && j != i)将为false。我们在else条款中。所以,divisor = N

答案 1 :(得分:2)

else {
    divisor = i;
}

这不好。你假设这检查除数是否确实是一个素数,如果它是,并且它也除了输入数,那么它将它赋给divisor变量。实际上,这不是发生的事情。相反,每当遇到不是素数的j时,这会将divisor的当前值分配给j。你想要的是按升序检查数字的所有素数因子,然后选择最后一个:

puts("Enter a positive integer:");
char buf[128];
fgets(buf, sizeof(buf), stdin);
unsigned n = strtoul(buf, NULL, 10);

unsigned d = 2, maxd = 1, orig = n;

while (d <= orig) {
    while (n % d == 0) {
        n /= d;
        maxd = d;
    }

    d++;
}

printf("\n\nMaximal prime factor: %u\n", maxd);

答案 2 :(得分:1)

for (int i = 2; i <= N; i++){
    if(N % i == 0){
        divisor = i;
        while((N/=i) % i == 0);
    }
}

答案 3 :(得分:0)

您尝试查找号码的所有除数,直到数字本身为止。 (这总是它本身的除数)。然后检查除数是否为素数,您尝试将所有数字的数字从2分为i-1。如果你找到一个除数,你就会正确地停止,但如果j不是一个除数,你就说我是素数(并将其保存为最大除数)。

答案 4 :(得分:0)

我认为内循环需要一些修改

bool isPrimeDivisor = true;
for(int j=2; j<i;j++) {//inner loop
    if(i%j == 0 && j!=i) {
        isPrimeDivisor = false;
        break;
    }
}
if(isPrimeDivisor) divisor = i;

答案 5 :(得分:0)

您可以使用循环向后工作,从i =小于或等于N / 2的最大整数开始。检查我是否是一个因素,然后检查它是否为素数,如果是,则返回它。

答案 6 :(得分:0)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//function to find factors
    long long int factors(long long a)
    {
        long long int i=1,c=0;
        for(i=1;i<=a;i++)
        {
            if(a%i==0)
            {
                c++;
            }
        }
        return c;
    }

    int main()
    { 
        long long int i,k,a,b;
        printf("enter an integer\n");
        scanf("%llu",&k);

        for(i=2;i<=k/2;i++)
        {                   
            if(k%i==0)
            {
                a=factors(i);
                if(a==2)                
                {
                    b=i;
                }   
            }
        }
    printf("\n______%.1llu_______\n",b);
    return 0;
}

这将为您提供整数的最大素数因子....