递归函数寻找素因数

问题描述 投票:0回答:12

我做了一个递归函数来查找数字的质因数,但它有一个错误,导致 Turbo c 退出。请帮忙

#include<stdio.h>
#include<conio.h>
int prime(int num);
int primefactor(int num,int i);
void main(void)
{
    int num;
    printf("Enter a number whose prime factors are to be calculated:");
    scanf("%d",&num);
    primefactor(num,i);
     i=num 
    getch();
}
int primefactor(int num,int i)
{
    if(i==2)
    return 1;
    if(num%i==0)
    {
        if(prime(num))
        {
            printf(",%d",num);
            num=num/i;
            i++;
        }


    }
    i--;
    primefactor(num,i);
    return 0;
}
int prime(int num)
{
    int i,flag;
    for(i=2;i<num;i++)
    {
        if(num%i==0)
    flag=0;
    }
    return flag;
}
c recursion
12个回答
5
投票
void main(void)
{
    int num,i=num; // (*)
    printf("Enter a number whose prime factors are to be calculated:");
    scanf("%d",&num);
    primefactor(num,i);
    getch();
}

您认为

i
(*)
有什么价值?

不确定你想要什么

i
开始,但我很确定你希望它是随机的。如果你想让它以
num
的值开始,你需要在读完后给它赋值
num

void main(void)
{
    int num,i; 
    printf("Enter a number whose prime factors are to be calculated:");
    scanf("%d",&num);
    i = num; // assignment goes here.
    primefactor(num,i);
    getch();
}

2
投票

(太困了,无法编写好的代码..所以对于任何错误提前表示歉意:p)

更简单的非递归版本

printPrimeFactors(int num) {

  for (i = 2; i < sqrt(num); i=getNextPrime()) {
     if (num %i)
        printf("%d", i);
  } 

}

如果你必须使用递归

void factorization(int x, int i=2)
{
   if(x==1)
    return;

   if(x%i==0&&isPrime(i))
   {
    printf("%d ",i);
    factorization(x/i,i);
   }
   else
    factorization(x,i+1);


}

1
投票

C++ 中的完整递归解决方案(对于 C,用 printf 替换 cout 行):

void printPrimeFactors(int num)
{
    static int divisor = 2; // 2 is the first prime number

    if ( num == 1 ) //if num = 1 we finished
    {
        divisor = 2; //restore divisor, so it'll be ready for the next run
        return;
    }
    else if ( num % divisor == 0 )  //if num divided by divisor
    {
        cout << divisor << " "; //print divisor
        printPrimeFactors( num / divisor ); //call the function with num/divisor
    }
    else //if num not divided by divisor
    {
        divisor++; //increase divisor
        printPrimeFactors( num ); 
    } 
}

1
投票

以低开销函数调用实现素因数分解的最佳方法是。 。 .

void factors(int number)
{
    int divisor = 2;
    if (number == 1) { cout << "1"; return; }
    while ((number % divisor) && (number > divisor)) divisor++;
    cout << divisor << ", ";
    factors(number / divisor);
}

函数调用(递归)的次数等于质因子的数量,包括1。


1
投票

我用 C 语言完成了此操作。根据编译器的不同,可能需要在程序中进行微小的更改。

#include<stdio.h>
int primefact(int);
int main()
{
    int n;
    printf("Enter a number whose prime factors are to be calculated : \n");
    scanf_s("%d", &n);
    printf("Prime factors of %d are : ");
    primefact(n);
    printf("\n");
    return 0;
}
int primefact(int n)
{
    int i=2;
    while(n%i!=0)
        i++;
    printf("%d ", i);
    if(n==i)
        return 0;
    else
        primefact(n/i);
}

0
投票

同意 IVlad - 另外,当 num 为素数时会发生什么?递归函数会被调用多少次,例如数字 = 7?


0
投票
#include<stdio.h>
#include<stdlib.h>

int ar[10]={0};
int i=0,j=2;

void P(int n)
{
    if(n<=1){
        return ;
    }

    else{
            if(n%j == 0){
                printf("%d\t",j);
                n=n/j;  

            }
            else{
                j++;                
            }   
        P(n);
    }
}

int main(void)
{
    int n;
    printf("Enter n = ");
    scanf("%d",&n);
    P(n);
    printf("\n");
    return 0;
}

0
投票
// recursivePrime.cpp
// Purpose: factor finding for an integer 
// Author: Ping-Sung Liao, Kaohsiung,TAIWAN
// Date: 2017/02/02
// Version : 1.0
// Reference:
// http://stackoverflow.com/questions/3221156/recursive-func-to-find-prime-factors

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


int primefactor(int num,int i);
int main(void)
{
    int num, i;
    printf("Enter a number whose prime factors are to be calculated:");
    scanf("%d",&num);
    i=int ( sqrt (num) );
    primefactor(num,i);

    system("pause");  // instead of getch()
}

int primefactor(int num,int i)
{   printf("num %d i=%d\n", num, i);
    if (i==1)
      printf("prime found= %d\n", num);  // prime appearing in he variuable num

    else if(num%i==0)
    {   primefactor( int (num/i) , int ( sqrt(num/i) ) );
        primefactor( i , int (sqrt ( i ) ) );       
    }
    else 
    {  i--;
       primefactor(num,i);
    }
    return 0;
}

0
投票
#include  <`stdio.h`>

void pf(int,int);

int main()

{

int a,i=2;

     printf("Enter the Number:\n");
     scanf("%d",&a);

     pf(a,i);
}

void pf(int x,int y)

{

   if(x==1)

   return 1;

    else
    {
       if(x%y==0)
       {printf("%d\t",y);
        pf(x/y,y);
       }

       else
       {
        y++;
        pf(x,y);
       }
    }
}

0
投票

我们不需要编写函数来计算下一个素数。例如,如果 num 是 24,我们不断地将它除以 2,直到它不再能被 2 整除,那么其他 2 的倍数也不能整除该数字。所以最终只有(可能)素数可以完美地整除任何正整数。

这是我的代码:(我已经为迭代逻辑和递归逻辑编写了源代码)

#include<stdio.h>  
  
void pfactors_rec(int, int);  
void pfactors(int);  
  
int main()  
{  
    int num;  
  
    printf("Enter a positive integer number\n");  
    scanf("%d", &num);  
  
    printf("\nPrime Factors of %d without using recursion\n", num);  
    pfactors(num);  
  
    printf("\nPrime Factors of %d using recursion\n", num);  
    pfactors_rec(num, 2);  
  
    return 0;  
}  
  
void pfactors_rec(int num, int count)  
{  
    if(num < 1)  
        return;  
    else if(num % count == 0)  
    {  
      printf("%d\n", count);  
      pfactors_rec(num / count, count);  
    }  
    else  
    {  
      pfactors_rec(num, count+1);  
    }  
}  
  
void pfactors(int num)  
{  
    int count;  
  
    for(count = 2; (num > 1); count++)  
    {  
        while(num % count == 0)  
        {  
            printf("%d\n", count);  
            num = num / count;  
        }  
    }  
    printf("\n");  
}  

0
投票
//JavaScript onliner to find prime factors using recursion
pf = (n,f,i=f?~-n:2,A=[]) => f ? ~-n && !~-i || !!(n%i) && pf(n,1,~-i) : !~-n ? A : !(n%i) && pf(i,1) ? (A=[...A,i], pf(n/i,0,i,A)) : pf(n,0,-~i,A)

//eg. pf(60) = [2,2,3,5]

-1
投票

java实现..

public class PrimeFactor {

public int divisor=2;
void printPrimeFactors(int num)
{

    if(num == 1)
        return;

    if(num%divisor!=0)
        {
        while(num%divisor!=0)
            ++divisor;          
        }
    if(num%divisor==0){

    System.out.println(divisor);
        printPrimeFactors(num/divisor);
    }

}
public static void main(String[] args)
{
    PrimeFactor obj = new PrimeFactor();
    obj.printPrimeFactors(90);
}

}
© www.soinside.com 2019 - 2024. All rights reserved.