我正试图找到用户输入数字的最大素数因子。
到目前为止我已经:
#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或其他一些非素数。
答案 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;
}
这将为您提供整数的最大素数因子....