质数因子

质数因子

https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607?tpId=37&&tqId=21229&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

质数因子

描述:功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

输入描述:输入一个整数

输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

示例1:输入:180,输出:2 2 3 3 5

方法一:

思路分析: 首先质因子的概念为在数论里,某一正整数的质因子指能整除该数的质数。比如66的质因子是33226=326 = 3 * 210010022个质因子:2255。(100=250100 = 2 * 50, 且100=520100=5 * 20,只有2255是质数),因为本题题目要求按照从小到大的顺序输出它的所有质因子包括重复的数据,输出结果特别注意用空格隔开,本题可以逐个记录变量的值,设定一个指针变量ii,用来记录质因子,从数字2开始,只要能被输入数据整除,就将ii值记录,然后将i值重新定义到22,继续循环判断,如果不能被整除,就将i值自增,最终将resres输出即可。 图解:alt

核心代码:

#include<stdio.h>

int main(){
    int res=0;
    scanf("%d",&res);//输入
    for(int i=2;i*i<=res;){
        if(res%i==0){//能够整除说明i是质因子
            printf("%d ",i);
            res=res/i;
            i=2;//重复的不能漏掉
        }
        else
            i++;//不能整除重新判断
    }
    printf("%d ",res);
}

时间复杂度:一个嵌套循环,始终要保证i方≤res,故平均时间复杂度为O(n)O(\sqrt{n})

空间复杂度:不需要借助辅助数组,因此空间复杂度为O(1)O(1)

方法二:

思路分析:同样,也可以采用递归的方法,如果能被整除num%i==0num \% i == 0,则记录以后进入递归继续进行判断,为了减少循环的次数,对numnum进行开根号处理,这样会导致可能最后一个不被记录,因此还需要加一条语句,将最后一个质数输入即可。

核心代码:

num = int(input())

def division(num):
    for i in range(2,int(num**0.5+1)):#**0.5表示开根号,int表示强制转换为整数
        if num % i == 0:##可以被整除
            print(str(i), end=' ')
            num = num // i
            division(num)#递归
            break
    else:
        print(str(num), end=' ')#最后一个可能是它本身

division(num)

时间复杂度: 一个forfor循环,用来查找合适的ii值并记录,一个递归用来加载下一个numnum数。故平均时间复杂度为O(nn)O(n\sqrt{n})

空间复杂度:不需要借助辅助数组,因此空间复杂度为O(1)O(1)

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务