质因数分解函数

编写函数void func(unsinged int n),实现计算并输出一个正整数的质因数分解式。例如:n为90时,输出90=2*3*3*5。

①是素数就输出:

可能直接想着先要做个判断了,如果是素数判断结束,输出这个素数。如果不是,在进入下面的分解的步骤吧。

但是,有没有人想过素数的定义是什么?素数是一类只能被1或自身整除的数字对吧?如果去掉之前的这个判断,直接在接下来的分解步骤中去判断会怎样?

假如输入了“11”,“11”是个素数,只能被1和11整除。那么,设置除数从2开始,是不是从2到10为止都没法整除呢?等到了11,11除以11刚好是1,这时候输出11。是不是和上面的判断的结果一样呢?

②、输出质因数的分解式,除数是素数:

在这里可能会有人会疑惑了,如果只用素数整除,是不是应该写个函数去输出素数呢?从2开始,3、5、7、11这样的去循环输出着素数。假如除不尽2就换3,以此类推。

如果真的这样去想,源码不仅会写的特别繁杂不说,还要经过反反复复的调试。那么,有没有更简单的方法呢?

假如,输入一个数字24。24可以分解成3X8或者4X6对吧?但是我们按照①的想法走,第一个除数是2,那么3X8就直接出局了。可能有人会想,24除2得到12,2加1是3,12除以3是4,3再加1是4,除数中有非素数了,不对啊!!!!!!况且4还能拆分成两个2啊?!

那么,可以在除以2的时候做个判断啊,如果第一次除后的所得的商能继续被2所整除,那除数就先不要加1就好了嘛!直到除不尽了,换下一个,以此类推。

如果到4了呢?岂不是要出现非素数吗?

不可能的,依照上面的想法,除数在没法整除后依次累加,得到的所有的除数只可能是素数。因为4在到达它之前,已经拆分成两个2了。如果是18,第一次得9,也就不会出现9,因为在9的前面已经有了3X3搞定了!!!

因此,这道题无非就是考一个累除法的编写。

 

#include <stdio.h>
#include <string.h>

void func(unsigned int n)
{
	int i=2,flag=0;
	while(n>=2) {
		if(n%i==0) {
			if(flag==1)
				printf("*");
			printf("%d",i);
			n=n/i;
			flag=1;
		} else {
			i++;
		}
	}
	printf("\n");
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
		func(n);
	return 0;
}

 思路参考:https://blog.csdn.net/Issac_X10A/article/details/81773427

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先需要判断一个数是否为素数,可以使用以下方法: 对于一个大于1的整数n,如果它不是素数,那么它一定可以分解成两个因数a和b,其中a和b都小于n。因此,我们只需要在2到n-1的范围内枚举所有可能的因数,判断n是否能被整除即可。如果n不能被任何一个小于n的数整除,那么n就是素数。 接下来,我们可以使用循环从2到n-1枚举所有可能的因数,判断它们是否为素数,并且能否整除n。如果能整除,那么这个数就是n的一个正因数。最后,如果没有找到任何一个正因数,就输出"no answer"。 以下是代码实现: n = int(input("请输入一个正整数:")) factors = [] for i in range(2, n): if n % i == : is_prime = True for j in range(2, i): if i % j == : is_prime = False break if is_prime: factors.append(i) if len(factors) == : print("no answer") else: print("n的所有为素数的正因数为:", factors) ### 回答2: 素数是指除了1和本身之外没有其他正整数可以整除的正整数。因此要判断一个数是否为素数,可以用一个循环依次判断2到该数减1之间的所有正整数是否可以整除该数,如果都不行,则该数是素数。现在有一个整数n,需要找出n的所有正因数中的素数。 我们可以利用两个循环,一个循环从2遍历到n,一个循环从1遍历到当前循环数之间的所有正整数。判断当前的正整数是否是n的因数,如果是,再判断该因数是否为素数,如果是,则输出该因数。如果没有找到任何素数因数,则输出“no answer”。 具体的代码实现如下: ```python n = int(input("请输入一个正整数:")) prime_factors = [] # 存储素数因数 for i in range(2, n+1): if n % i == 0: # 判断是否为n的因数 for j in range(2, i): if i % j == 0: # 判断是否为素数 break else: prime_factors.append(i) if prime_factors: print(f"{n}的素数因数为:{prime_factors}") else: print("no answer") ``` 我们首先从2开始遍历到n,判断每个数是否为n的因数。如果是,则进入内层循环,从2开始遍历到当前数之间的正整数。如果找到了一个能够整除当前数的正整数,就说明当前数不是素数,跳出内层循环。如果内层循环正常结束,就说明当前数是素数,将它加入素数因数列表中。最后判断素数因数列表是否为空,如果不为空,则输出所有素数因数,否则输出“no answer”。 例如,当我们输入n=84时,程序输出: ``` 84的素数因数为:[2, 3, 7] ``` 这是因为84的所有因数为1、2、3、4、6、7、12、14、21、28、42、84,其中2、3、7为素数因数。 ### 回答3: 在解决这道题之前,我们需要先了解素数的定义以及判断素数的方法。 素数是指除了1和它本身以外,无法被其他正整数整除的数。判断一个数是否为素数的方法有很多种,其中最常见的方法是试除法,即把这个数从2到根号n的范围内的所有数都试着去除一遍,如果都无法整除,则它是素数。 既然已经掌握了素数的判断方法,那么我们就可以按照以下的思路来编写程序: 1. 首先,从控制台输入一个正整数n(n>0)。 2. 遍历从1到n的所有正整数,判断它们是否为n的因数。 3. 对于每个n的因数m,判断m是否为素数,如果是,则输出m。 4. 如果在1到n的所有正整数中没有任何一个数是n的素数因数,则输出“no answer”。 以下是示例代码实现: ```python import math n = int(input("请输入一个正整数n:")) flag = False #标记是否至少有一个素数因数 for i in range(1, n+1): if n % i == 0 and i > 1: #如果i是n的因数,则判断i是否为素数 for j in range(2, int(math.sqrt(i))+1): if i % j == 0: break else: print(i, end=" ") flag = True if flag == False: #如果没有任何一个数是n的素数因数,则输出“no answer” print("no answer") ``` 我们可以通过以下几个测试用例来验证程序的正确性: 输入:6 输出:3 输入:10 输出:5 输入:11 输出:11 输入:12 输出:2 3 输入:13 输出:13 输入:15 输出:3 5 输入:30 输出:2 3 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值