python编程练习4

今天的第一道编程题目比较简单,是将16进制的字符串转换为10进制的

import sys
for i in sys.stdin:
    print str(int(i, 16))

有人是这么写的

while True:
    try:
        x = raw_input()
        print int(x, 16)
    except:
        break

今天的第二道题目:质数因子
输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
最后一个数后面也要有空格

自己先尝试写了一下,但是没有成功,主要是在寻找因子的循环出了问题。

#import math

def factor(x):
    i = 1
    l = []
    if x.isdigit and int(x) > 0:
        x = int(x)
        while i < x:
             if x % i == 0:
                l.append(i)
             x /= i
             i += 1
    return l


if __name__ == '__main__':
    x = raw_input('Pls input the num: ')
    y = factor(x)
    z = set(sorted(y))
    for j in list(z):
        print j

如果x可以整除i,那么i就是其中一个因子,然后x整除i之后的商赋给x,x继续判断是否整除i,如果可以整除,如此循环,不可以整除,那么i+1,再进行上面的循环判断。其实是需要两个循环的,第一个循环是控制因子的,实现因子的递增,内部的循环是判断是否可以整除,一直到不可以整除才推出内部循环。
下面是一个通过的例子,就是通过两个循环实现的:

m=int(raw_input())
line=[]
i = 2
while i*i<=m:
    while m%i==0:
        m = m/i
        line.append(i)
    i = i+1
if m !=1:
    line.append(m)
for j in line:
    print j,
print ''

虽然可以通过测试,但是感觉这个代码还不是很严谨。

下面是另外一个例子,先写了一个判断质数的函数,第二个函数中,先把质数因子找出来,然后在else语句中将整数分解开来,当然也需要两层循环来实现。

def isPrime(n):
    return not [i for i in xrange(2, int(n ** 0.5) + 1) if n % i == 0]
     
def primeFactors(x):
    a = [i for i in xrange(2, int(x ** 0.5) + 1) if isPrime(i) and x % i == 0]
    if len(a) == 0:
        return str(x) + ' '
    else:
        factors = []
        for i in a:
            while x % i == 0:
                factors.append(i)
                x //= i
        if x != 1:
            factors.append(x)
        return ' '.join(map(str, factors)) + ' '
         
print primeFactors(input())

参考资料:
https://www.nowcoder.com

你可能感兴趣的:(python编程练习4)