2010-07-10 73 views
0

我做了一個遞歸函數來找到一個數字的主要因素,但它有一個錯誤,使渦輪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; 
} 
+7

_Turbo C 2 _正如在上世紀80年代時期的C編譯器? – 2010-07-10 23:02:16

+0

編譯器報告問題和/或崩潰的線是什麼?你沒有提供任何有助於人們解決問題的信息。 – 2010-07-10 23:03:55

+1

borland turbo c 3東西..我不明白爲什麼我在大學教它:( – 2010-07-10 23:10:58

回答

1

(有點太困了,要寫出好的代碼..所以很抱歉,您的任何錯誤:P)

一個簡單的非遞歸版本

printPrimeFactors(int num) { 

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

} 
,如果你要使用遞歸

printPrimeFactors(int num) { 

if(isPrime(num)) { 
    printf ("%d ", num); 
} else { 
    for(i=2; i < sqrt(num); i++) { 
     if(num%i ==0) { 
       printPrimeFactors(i); 
       printPrimeFactors(num/i); 
     } 
    } 
} 

} 
+0

是否可以解釋:( – 2010-07-14 12:48:21

+0

很快就會提出一些解釋。對不起, – 2010-07-15 10:26:03

+1

你還困?或者你現在應該已經更正了這個代碼 – rick112358 2015-04-18 05:57:45

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(); 
} 
+0

哦大聲笑,我這麼愚蠢:P感謝很多:) – 2010-07-10 23:11:45

+0

'void main'? =( – jamesdlin 2010-07-11 00:24:25

+0

我盡我所能擺脫虛空主,但這是我正在教:(int main()很多好一倍 – 2010-07-14 12:45:08

0

同意IVlad - 此外,當num是首要的情況下會發生什麼?遞歸函數要調用多少次數字= 7?

+0

...和 ​​- 如何素數返回它對於調用者是否有價值? – 2010-07-10 23:14:47

+0

我使用了素數因子計算的概念和一個沒有遞歸求助的主因子程序 http://pastebin.com/fVbjFGzQ – 2010-07-10 23:19:21

+0

我沒有在素數的任何位置看到return語句功能 另外 - 嘗試通過num = 7(和i = num分配在正確的地方)的代碼,看看會發生什麼... – 2010-07-10 23:21:22

1

C++中的完整遞歸解決方案(for 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); 
    } 
} 
+0

爲什麼在這種情況下'static'是必須的? – shinzou 2014-12-10 19:48:11

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

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

我建議你不要包含更正的代碼,只是解釋有關的錯誤以及如何解決它的一般方向。 – 2014-07-04 18:10:34

+0

有沒有必要添加一個答案已正確回答的問題。並作爲@TheocharisK。說,請在下次再添加一個解釋給你的答案。順便說一句,歡迎來到SO。 – Pr0gr4mm3r 2014-07-04 18:13:45

-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); 
} 

} 
+0

除了試圖解決原始問題之外,這與原始問題中提出的* Turbo C *問題無關。 – 2015-05-11 20:40:39

+0

快速解釋爲什麼這是正確的做法是有好處的。 – David 2015-05-11 20:53:20

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
// 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; 
} 
+1

儘管此代碼可能會回答問題,但提供有關如何解決問題和/或解決問題原因的其他上下文會提高答案的長期價值。 – 2017-02-02 14:43:16