C 不使用exit语句的递归。,
我写了一个程序来查找输入的数字的素数因子C 不使用exit语句的递归。,,c,recursion,return,C,Recursion,Return,我写了一个程序来查找输入的数字的素数因子 #include<stdio.h> #include<conio.h> #include<stdlib.h> void pf(int, int,int); int main() { int num,i=2,j=2; printf("Enter a number : "); scanf("%d", &num); pf(num,i,j); getch(); retu
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void pf(int, int,int);
int main()
{
int num,i=2,j=2;
printf("Enter a number : ");
scanf("%d", &num);
pf(num,i,j);
getch();
return 0;
}
void pf(int num,int i, int j)
{
int rem, rem2;
if(num==1)
exit(1);
if(i>j)
{
rem=i%j;
if(rem==0)
pf(num,i+1,2);
if(rem!=0)
pf(num,i,j+1);
}
if(i==j)
{
rem2=num%i;
if(rem2==0)
{
printf("%d, ", i);
num=num/i;
pf(num,i,j);
}
if(num!=1)
pf(num,i+1,2);
}
}
#包括
#包括
#包括
无效pf(int,int,int);
int main()
{
int num,i=2,j=2;
printf(“输入一个数字:”);
scanf(“%d”和&num);
pf(num,i,j);
getch();
返回0;
}
无效pf(整数、整数i、整数j)
{
int-rem,rem2;
如果(num==1)
出口(1);
如果(i>j)
{
rem=i%j;
如果(rem==0)
pf(num,i+1,2);
如果(rem!=0)
pf(num,i,j+1);
}
如果(i==j)
{
rem2=num%i;
如果(rem2==0)
{
printf(“%d”,i);
num=num/i;
pf(num,i,j);
}
如果(num!=1)
pf(num,i+1,2);
}
}
我正在研究递归,但我经常使用
exit()
语句。当我使用return
语句时,它变得非常困难。有谁能告诉我如何用return
语句替换这个程序中的exit语句吗。该程序运行良好,但在输入大量数据时,程序每次都会崩溃。我在您的代码中发现两个问题。也许解决了这两个问题之后就没事了:
退出(1)
替换为返回1代码>
之后,如果(i==j)
,则必须执行以下操作:如果
pf
要返回,则必须连同其所有调用一起返回。所以,我提议这样的改变
#include <stdio.h>
void pf(int n, int d);
int main(void){
int num;
printf("Enter a number : ");
scanf("%d", &num);
pf(num, 2);
return 0;
}
void pf(int num, int i){
if(num == 1)
return ;
if(num % i == 0){
printf("%d, ", i);
pf(num / i, i);
return ;
}
if(i == 2)
pf(num, i + 1);
else
pf(num, i + 2);
}
只需将返回值1替换为退出位置(1)@Siraj一个数字的素数因子是什么?@Siraj如果(真)该语句的含义是什么?素数因子是一个数字的简单因子,例如,24有素数因子2,2,2,3,18有素数因子2,3,3,这意味着,将这些数字相乘将给出输入的数字。这个数的所有因子都应该是素数,2,3,5,7,11等等!!ohhh,用rem2==0替换TRUE,它只在程序崩溃后4位整数才起作用,而且你怎么能从声明为void的函数返回呢?我无法开发他的逻辑@ameyCUNo,它与20000(5个数字)合作得很好。我不认为它的声明无效在其中做了任何错误。今天我加入了stackoverflow,我真的很高兴来到这里。非常感谢@BLUEPIXYNote,算法非常慢。对于1111000到1111010范围内的值,可能需要32秒才能找到1111004的素数因子(2、2和277751),其中不同的算法需要毫秒。当这些因素很小时,它似乎起作用,但当它们很大时,则需要很长的时间。这与这个答案中的分析完全无关,这很好,对于1111007这样的素数,它比非常慢更糟糕。它花费了7m 36秒,进程大小达到了2432748(通过Mac上的ps-l测量)。这是一个庞大的项目规模和很长的时间。我对它的完成感到有点惊讶(当它确实完成时,我是用“它不完成”来起草这个评论的)。它没有说关于算法。我认为它可能会在32秒之前发生堆栈溢出。
#include <stdio.h>
void pf(int n, int d);
int main(void){
int num;
printf("Enter a number : ");
scanf("%d", &num);
pf(num, 2);
return 0;
}
void pf(int num, int i){
if(num == 1)
return ;
if(num % i == 0){
printf("%d, ", i);
pf(num / i, i);
return ;
}
if(i == 2)
pf(num, i + 1);
else
pf(num, i + 2);
}
void pf(int num, int i){
if(num == 1)
return ;
if(num % i == 0){
printf("%d, ", i);
pf(num / i, i);
} else {
pf(num, i + 1 + (i != 2));
}
}