【Python】【demo实验17】【练习实例】【将一个正整数分解质因数】

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

我的源代码:

#!/usr/bin/python
# encoding=utf-8
# -*- coding: UTF-8 -*-

# 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

a = int(input("please input the number:\n"))
b = a
# a 的因数集合
la = []

l = []

c = int(a*0.5)+2
print("c: ==> ",c)

for i in range(2,c):
    if i !=2 and i%2==0:
        continue
    elif i !=3 and i%3==0:
        continue
    elif i !=5 and i%5==0:
        continue
    elif i !=7 and i%7==0:
        continue
    elif i !=11 and i%11==0:
        continue
    elif i !=13 and i%13==0:
        continue
    elif i !=17 and i%17==0:
        continue
    elif i !=19 and i%19==0:
        continue
    elif i !=23 and i%23==0:
        continue
    elif i !=29 and i%29==0:
        continue

    #print(i,"###")
    if a%i==0:
        la.append(i)
        a = a/i
        while(1):
            if a%i==0:
                la.append(i)
                a =a/i
            else:
                break
if len(la) == 0:
    la.append(1)
    la.append(b)

print(b," = ",end=" ")
for i in range(len(la)):
    print(la[i],end=" ")
    if i==len(la)-1:
        print("\n")
    else :
        print(" * ",end=" ")

此代码的弊端,就是对于一个稍微大一点的数,但是其质因子都是比较小的数,处理起来太浪费时间:

所以想过,对于大一些的数的处理逻辑:

1、先建立一个数字y以内的质数表

2、优先查看这个大数所包含的质数表内的所有质因子;

3、对于质因子不在列表范围内的,再执行搜索程序;(这个比较耗时间)

优化后的代码(对于较大的数字,都能以稍快一些的时间处理完):

#!/usr/bin/python
# encoding=utf-8
# -*- coding: UTF-8 -*-

# 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

a = int(input("please input the number:\n"))
b = a
# a 的因数集合
la = []
x = 0
#y = 1000000 #用于判断计算质数列表的最大临界
y = 300000 #用于判断计算质数列表的最大临界

if 1:
    # 先构建一个质数列表:
    l = []
    for i in range(2,y):
        k = 1
        if i == 2:
            l.append(i)
            continue
        else :
            m = int(i ** 0.5)  #square root
            for j in range(2,m):
                if i%j == 0:
                    k = 0;
                    #print(i,"is not a prime.")
                    break
        if k == 1:
            l.append(i)
    #print("list:   ",l)

    #排查这个数对应的列表内的质因子:

    for n in range(len(l)):
        #print(n,"###")
        if a%l[n]==0:
            la.append(l[n])
            a = a/l[n]
            while(1):
                if a%l[n]==0:
                    la.append(l[n])
                    a =a/l[n]
                else:
                    break
        c = 1 #c用于标记la列表的个数之积是否等于a

        for o in range(len(la)):
            c = c * la[o]
        if c == b:
            x = 1    #x用于标记a这个数的质因子是否全部找到了,如果为1,表示全部找到了;x默认为0;

# 第一步处理完毕;
d = int(a)
f = int(a)

"""
print(b," = ",end=" ")
for i in range(len(la)):
    print(la[i],end=" ")
    if i==len(la)-1:
        print("* the new number!\n")
    else :
        print(" * ",end=" ")
"""
# print("==> d = ",d)
# 下一步的数据循环点;
# 只用于计算较大的质因子。

if x == 0:
    e = int(d*0.5)+2
    # print("==> e = ",e)
    if y<e:    #对于特别大的数字a;
        for i in range(y,e):  #我得去判断y比e大还是小啊;
            print(i,"###")
            if d%i==0:
                la.append(i)
                x = 2 #标记la列表有增加;
                d = d/i
                while(1):
                    if d%i==0:
                        la.append(i)
                        d =d/i
                    else:
                        break
    else :
        for i in range(2,e):  #我得去判断y比e大还是小啊;
            print(i,"###")
            if d%i==0:
                la.append(i)
                x = 2 #标记la列表有增加;
                d = d/i
                while(1):
                    if d%i==0:
                        la.append(i)
                        d =d/i
                    else:
                        break
    if x == 0:    #表明d本身为质数,为a的质因数;
        #print("2:",la,"f:",f)#
        la.append(f)
    #print("1:",la)#

# 对于输入的数字为质数的情况;
if len(la) == 0:
    la.append(1)
    la.append(b)
# 这里面实际将1当做质数了,如果默认1不为质数,那么可以输出:a是质数;无质因子;

print(b," = ",end=" ")
for i in range(len(la)):
    print(la[i],end=" ")
    if i==len(la)-1:
        print("\n")
    else :
        print(" * ",end=" ")

处理结果:

原题给出的解答:

————————(我是分割线)————————

参考:

1. RUNOOB.COM:https://www.runoob.com/python/python-exercise-example14.html

备注:

初次编辑时间:2019年9月29日19:14:24

环境:Windows 7   / Python 3.7.2

原文地址:https://www.cnblogs.com/kaixin2018/p/11609558.html

时间: 2024-10-23 00:13:27

【Python】【demo实验17】【练习实例】【将一个正整数分解质因数】的相关文章

【python】将一个正整数分解质因数

def reduceNum(n): '''题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5''' print '{} = '.format(n), if not isinstance(n, int) or n <= 0 : print 'Please input a valid number !' exit(0) elif n in [1] : print '{}'.format(n) while n not in [1] : # 循环保证递归 for index in

代码实现:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

import java.util.Scanner; /*题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步.*/ public class Test

将一个正整数分解质因数

将一个正整数分解质因数                         #include <stdio.h> int main() { int n,i; printf("请输入一个数:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) while(n!=i) { if(n%i==0) { printf("%d*",i); n=n/i; }

Java实现将一个正整数分解质因数

* 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:  *(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可.  *(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步.  *(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步.  *这个题目很明显是要用递归算法来实现的,打印"*"有些技巧,但也

54.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

#include<iostream> using namespace std; int isPrime(int); int main() { int n; cout<<"please input an number:"<<endl; cin>>n; cout<<n<<"="; for(int i=1;i<=n;i++) { if(n%i==0) { if(isPrime(i)) { cou

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

1 import java.util.*; 2 public class lianxi04{ 3 public static void main(String []a) { 4 Scanner s = new Scanner(System.in); 5 System.out.print( "请键入一个正整数:     "); 6 int n= s.nextInt(); 7 int k=2; 8 System.out.print(n + "=" ); 9 while(

利用matlab实现以下功能:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序思路: 对n进行分解质因数,应先找到一个最小的质数k,从2开始,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n不等于k,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行 (1). Matlab实现的程序如下: clear all n=input('pelase input the number:')                     %保存输入的值 m=2;                          

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

package a; import java.util.*; public class Fenjiezhiyinshu { public static void main(String[] args) { System.out.println("输入一个正整数:"); Scanner a=new Scanner(System.in); int m=a.nextInt(); int k=2; if(m==1) { System.out.println("输入的数为m="

【笔试】4、正整数分解质因数

/* * 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. * 时间:2015年7月27日14:48:08 * 文件:lianxi04.cp