首页 > 其他分享 >使用递归函数来实现输入正整数,将正整数分解鸡(质因)数

使用递归函数来实现输入正整数,将正整数分解鸡(质因)数

时间:2023-07-10 20:31:37浏览次数:49  
标签:正整数 递归 递归函数 input 质因 质因数 tmp1

介绍一下递归函数:

当我们定义一个函数时,如果函数内部调用了自身,那么这个函数就称为递归函数。递归函数是一种解决问题的方法,它将大问题分解为相同或类似的小问题,并通过逐步解决这些小问题来解决整个问题

使用递归函数的核心思想是将一个问题拆解为更简单的子问题,并且解决子问题的方法和解决整个问题的方法是一样的。递归函数通常包括两部分组成:递归条件和基本情况。

  1. 递归条件:递归函数中需要定义一个条件,当满足这个条件时,函数将不再递归调用,而是直接返回结果。这样可以确保递归函数在适当的时候停止递归调用。
  2. 基本情况:递归函数中需要定义一个或多个基本情况,即当问题无法再分解,或者达到最小子问题时,递归函数直接返回固定的结果。基本情况相当于递归函数的终止条件,保证了递归函数能够停止并返回结果。

使用递归函数的步骤如下:

  1. 定义递归函数,确定函数的输入参数和返回值类型。
  2. 在递归函数中,首先判断是否满足递归条件。如果满足,则直接返回特定值作为结果。
  3. 如果不满足递归条件,将问题拆解为更小的子问题,并调用自身来解决子问题。通过递归调用,将问题规模逐渐缩小,直到满足递归条件时停止。
  4. 结合子问题的结果,得到整个问题的解。
  5. 返回结果。

需要注意的是,使用递归函数时要确保递归能够在有限的时间内结束,否则可能会导致无限循环或栈溢出的问题。另外,递归函数的性能通常比迭代函数差,因此在实际应用中需要权衡使用递归还是其他方法。

总之,递归函数是一种通过将问题分解为相同或类似的子问题来解决整个问题的方法。使用递归函数时,需要定义递归条件和基本情况,并确保递归能够正确终止。

介绍一下什么是鸡(质因)数:

质因数是指可以整除一个正整数的质数。简而言之,就是将一个正整数分解为若干个质数的乘积,这些质数就是它的质因数。

举个例子,如果我们要找出12的质因数,我们可以将12分解成2 * 2 * 3,其中2和3都是质数,它们就是12的质因数。

编程思路:

编程思路是实现一个递归函数来对输入的正整数进行质因数分解,并最终输出结果。

代码的思路如下:

  1. 首先,在main函数中通过循环读入一个正整数,并判断输入是否合法。输入的正整数保存在变量input中。
  2. 接下来,调用achieve函数进行质因数分解。achieve函数的参数是输入的正整数input。
  3. 在achieve函数中,首先定义了两个变量tmp1和tmp2,并初始化为0,以及一个循环变量i初始化为2。tmp1用来保存input除以i的商,tmp2用来保存input除以i的余数。
  4. 然后,如果输入的正整数input小于2,则直接返回,不再进行质因数分解。
  5. 在一个无限循环中,先计算tmp1和tmp2的值,tmp1为input除以i的商,tmp2为input除以i的余数。
  6. 如果tmp2不等于0,说明i不能整除input,需要将i加1,继续尝试其他质数。
  7. 如果tmp2等于0,说明i能够整除input,即找到了一个质因数。打印出该质因数i,并在之后打印一个" * "的符号。
  8. 然后,递归调用achieve函数,输入参数为tmp1,对tmp1进行继续的质因数分解。
  9. 重复步骤5到8,直到tmp1小于等于1,即质因数分解完成。
  10. 最后,在main函数中,输入的正整数input的质因数分解结果被打印出来。

以上通过递归的方式,将输入的正整数进行质因数分解,输出分解结果。代码简单明了,通过循环读入和递归的思路达到了分解质因数的目的。

源代码:

//输入正整数,将正整数分解质因数。质因数要满足两个条件:1)是这个数的因数;2)是质
//数(素数) 如: 6 = 2 * 3      12 = 2 * 2 * 3
//
void achieve(int input){
	int tmp1 = 0, tmp2 = 0, i = 2;
	if (input < 2) {
		//printf("%d", input);
		return;
	}
	while (1) {
		tmp1 = input / i;
		tmp2 = input % i;
		if (tmp2 != 0)		//分解
			i++;
		else
			break;
	}
	printf("%d  ", i);
	if (tmp1 > 1)		//判断是否为最后一个质数,来选择是否打印*
		printf("* ");

	achieve(tmp1);

}


int main() {
	int input = 0;

	while (1) {			//读入一个正整数
		printf("请输入一个正整数:\n");
		scanf("%d", &input);
		if (input > 0)
			break;
		else
			printf("输入非法请重新输入!!!\n");
	}
	printf("%d = ", input);
	achieve(input);			//递归函数,实现分解质因数

	return 0;
}

运行结果:

使用递归函数来实现输入正整数,将正整数分解鸡(质因)数_质因数分解

基本功能已经实现,当然这个代码还存在着漏洞,例如输入1的时候,不会打印分解后结果,感兴趣的同学可以自行优化。

标签:正整数,递归,递归函数,input,质因,质因数,tmp1
From: https://blog.51cto.com/u_16158769/6680382

相关文章

  • 2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石
    2023-07-05:爱丽丝和鲍勃继续他们的石子游戏许多堆石子排成一行,每堆都有正整数颗石子piles[i]游戏以谁手中的石子最多来决出胜负。爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,M=1。在每个玩家的回合中,该玩家可以拿走剩下的前X堆的所有石子,其中1<=X<=2M然后,令M=max......
  • C#的winform中控制TextBox中只能输入正整数
    txt_n是要输入的文本的名字privatevoidtxt_n_KeyPress(objectsender,KeyPressEventArgse){if(e.KeyChar!='\b')//这是允许输入退格键{intlen=txt_n.Text.Length;if(len......
  • 【算法】根据输入的正整数,重新排列生成一个更大的数字
    需求:创建一个函数,该函数取一个正整数,并返回下一个较大的数字,该数字可以通过重新排列其数字来形成。例如:12===>21513==>5312017===>2071如果数字不能重新排列以形成更大的数字,则返回-1:9===>-1111=>-1531=>-1......
  • 分治/质因数分解 POJ1845 求pow(a, b)的所有约数之和
    //POJ1845求pow(a,b)的所有约数之和//方法:1,分解质因数,将a分解成p1^k1*p2^k2^...*pn^kn//2,那么pow(a,b)为p1^(k1*b)*p2^(k2*b)^...*pn^(kn*b)//3,对于单独的pi^(ki*b),他所有的约数为(1,pi,pi^2,pi^3.....pi^(ki*b));//4,那么整个式子来说,pow(a,......
  • 分解质因数
    /题目:将一个正整数分解质因数。例如:输入90,打印出90=2335。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外打印出即可。(2)但n能被k整除,则应打印出k的值,并用n除以k的商,作......
  • oracle统计出正整数对应二进制的里面1的位数
    declarennumber:=15; count1int:=0;begin whilen<>0 loop n:=bitand(n,n-1); count1:=count1+1; endloop; dbms_output.put_line(count1); end;结果为:   对于负数oracle似乎处理不了,正整数没问题。......
  • 2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为
    2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。现在,给定两个正整数L和R(以字符串形式表示),返回包含在范围[L,R]中的超级回文数的数目。输入:L="4",R="1000"。输出:4。答案2023-06-12:该算法的基本思路是从较小的回文数开始......
  • 2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为
    2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。现在,给定两个正整数L和R(以字符串形式表示),返回包含在范围[L,R]中的超级回文数的数目。输入:L="4",R="1000"。输出:4。答案2023-06-12:该算法的基本思路是从较小的回......
  • 输入正整数N,检查它是否可以被其数字之和整除
    题目:*输入正整数N,检查它是否可以被其数字之和整除,*输出YES或者NO。不考虑不合理的输入等特殊情况。eg:*例如:78的各位数字之和是:7+8=15,则78是一个各位数字之和能被15整除的整数。classTest53{publicstaticvoidmain(String[]args){Scannerinpu......
  • PHP质因数分解,的啊质数乘以大质数逆运算
    <?php$int=97*997;if(!is_int($int)||$int===0){//32位INT最大值2147483647,64位INT最大值9223372036854775807echo"积太大,算不过来!";die;}if($int<=2){echo$int."=".$int;die;}$result=$int.'=&#......