Python中的排列和组合

今天写一个判断是否为循环素数的题,题干如下


题目内容:
数字197可以被称为循环素数,因为197的三个数位循环移位后的数字:197,971,719均为素数。100以内这样的数字包括13个,2,3,5,7,11,13,17,31,37,71,73,79,97。要求任意正整数n以内一共有多少个这样的循环素数。

输入格式:
一个正整数n。

输出格式:
n以内循环素数的数目。

输入样例:
100

输出样例:
13


其中需要拆分一个整数各位并进行重新组合,不过这里的组合只是循环移位就可以了。本题目我的实现代码如下

#python 2.7可用,3.0+需要更改input 和 print()
import math

def split(num):
    data = []
    while num != 0:
        data.append(num % 10)
        num //= 10
    return data

def combine(data):
    return_data = []
    lens = len(data)
    for i in range(lens):
        sum = 0
        for j in range(lens):
            index = i+j
            if index >= lens:
                index -=lens
            sum += data[index]*10**j
        return_data.append(sum)
    return return_data


def isPrime(n): 
    if n <= 1: 
        return False
    for i in range(2, int(math.sqrt(n)) + 1): 
        if n % i == 0: 
            return False
    return True


def isCirclePrime(n):
    if isPrime(n):
        for i in combine(split(n)):
            if not isPrime(i):
                return False
                break
        return True
    else:
        return False

n = int(raw_input())

count = 0

for i in range(1,n):
    if isCirclePrime(i):
        count +=1

print count

做这个题的时候联想到了一个问题,如何组合排列n个字符?
本来想动手写算法,但转念一想,万能的python说不定已经实现了呢?
百度之:

import itertools

lists = ['a','b','c','d']

for i in range(1,len(lists)+1):
    print (list(itertools.permutations(lists,i)))#排列,和顺序有关
    print (list(itertools.combinations(lists,i)))#组合,和顺序无关

输出:

[('a',), ('b',), ('c',), ('d',)]
[('a',), ('b',), ('c',), ('d',)]

[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'b'), ('a', 'c', 'd'), ('a', 'd', 'b'), ('a', 'd', 'c'), ('b', 'a', 'c'), ('b', 'a', 'd'), ('b', 'c', 'a'), ('b', 'c', 'd'), ('b', 'd', 'a'), ('b', 'd', 'c'), ('c', 'a', 'b'), ('c', 'a', 'd'), ('c', 'b', 'a'), ('c', 'b', 'd'), ('c', 'd', 'a'), ('c', 'd', 'b'), ('d', 'a', 'b'), ('d', 'a', 'c'), ('d', 'b', 'a'), ('d', 'b', 'c'), ('d', 'c', 'a'), ('d', 'c', 'b')]
[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')]

[('a', 'b', 'c', 'd'), ('a', 'b', 'd', 'c'), ('a', 'c', 'b', 'd'), ('a', 'c', 'd', 'b'), ('a', 'd', 'b', 'c'), ('a', 'd', 'c', 'b'), ('b', 'a', 'c', 'd'), ('b', 'a', 'd', 'c'), ('b', 'c', 'a', 'd'), ('b', 'c', 'd', 'a'), ('b', 'd', 'a', 'c'), ('b', 'd', 'c', 'a'), ('c', 'a', 'b', 'd'), ('c', 'a', 'd', 'b'), ('c', 'b', 'a', 'd'), ('c', 'b', 'd', 'a'), ('c', 'd', 'a', 'b'), ('c', 'd', 'b', 'a'), ('d', 'a', 'b', 'c'), ('d', 'a', 'c', 'b'), ('d', 'b', 'a', 'c'), ('d', 'b', 'c', 'a'), ('d', 'c', 'a', 'b'), ('d', 'c', 'b', 'a')]
[('a', 'b', 'c', 'd')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>