每日一题——将一个正整数分解质因数

12. 将一个正整数分解质因数

方法1:有一点点麻烦,分为两部分:1.先筛选出小于这个正整数的所有质数;2.再从这些质数中提取因数。

# 将一个正整数分解质因数
from math import sqrt

n = eval(input("输入一个大于1的正整数:"))


def prime_num(n):
    # 存储小于n的质数
    leap = 1
    nums = []
    for m in range(2, n + 1):
        k = int(sqrt(m + 1))
        for i in range(2, k + 1):
            if m % i == 0:
                leap = 0
                break
        if leap == 1:
            nums.append(m)
        leap = 1
    return nums


def factor_pn(n, nums):
    i = 1
    the_num = n
    for j in nums:
        while j <= the_num:
            if the_num % j == 0:
                factor = j  # 质因数
                if i == 1:
                    print(factor, end=' ')
                else:
                    print('*', factor, end=' ')

                the_num = int(the_num / j)
                i += 1
            else:
                break


nums = prime_num(n)
print(n, '以内的质数:', nums)
print('分解质因数:')
factor_pn(n, nums)

 函数prime_num(n)也可直接用来解决输出某个正整数以内的质数问题。

方法2:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

        1.如果这个质数恰好等于n,则说明分解质因数的过程已经结束,打印出即可;

         2.如果n>k,但能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,然后重复第一步;

        3. 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

这个方法其实和方法1中的函数factor_pn(n, nums)是差不多的,也可以说方法1的第一步其实是多余的,因为每次都将the_num 除以 j的商赋值给the_num,也就不会有非质数的存在了。

from sys import stdout

n = int(input("输入一个大于1的正整数:"))
for i in range(2, n + 1):
    while n != i:
        if n % i == 0:
            stdout.write(str(i))
            stdout.write('*')
            n = n / i
        else:
            break

print(int(n))

关于stdout.write(),其实当我们在 Python 中调用 print(obj) 的时候,事实上是调用了sys.stdout.write(obj '\n')

print 将obj打印到了控制台,然后又追加了一个换行符“\n”

print 其实可以看作是调用了 sys.stdout 的 write 方法。

看一个简单的例子会帮助理解:

import sys

sys.stdout.write('hello')
sys.stdout.write('world')
print('\n')
sys.stdout.write('hello\n')
sys.stdout.write('world\n')
print('\n')
print('hello')
print('world')

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨小古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值