一个小学奥数题的python实现(全排列,字符串循环移位,统计元素)

本文通过Python解决小学奥数问题,首先生成1~10的全排列,然后判断并存储符合条件的解。由于可能出现重复解,通过选定起始数切开环状字符串并进行循环位移,确保每个解只出现一次。最后对位移后的字符串进行计数,以完成解的去重统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 13:37:22 2014

@author: zhu
"""
#将1到10填入正五边形的顶点和边,使得每条边三数之和相等,求总数

import itertools
l=[i for i in range(1,11)]
ls=list(itertools.permutations(l))#全排列
results=[]
k=0
N=len(ls)
rerange=[]
for i in range(N):
    l1=ls[i][0]+ls[i][1]+ls[i][2]
    l2=ls[i][2]+ls[i][3]+ls[i][4]
    l3=ls[i][4]+ls[i][5]+ls[i][6]
    l4=ls[i][6]+ls[i][7]+ls[i][8]
    l5=ls[i][8]+ls[i][9]+ls[i][0]
    if l1==l2 and l2==l3 and l3==l4 and l4==l5 and l5==l1: 
        s=[str(ls[i][x]) for x in range(len(ls[i]))]    #将符合条件的元组每一个元素(int型)转换成字符    
        results.append(''.join(s)) #tulpe to str
def str_trans(mystr,ind): # str_loop ,ind means find the position in str
     new_str=("%s%s"%(mystr[ind:],mystr[0:ind])) # exchange str at ind 
     return new_str  

for i in range(len(results)):  #对每一个元素都进行判断从10开始,方便找出重复
    ind=results[i].find('10') 
    nstr=str_trans(results[i],ind)
    rerange.append(nstr)

d={}
for x in range(len(rerange)): # count 
    if rerange[x] in d:
        d[rerange[x]]+=1
    else:
        d[rerange[x]]=1

for k in d.keys(): #print 
    print k

原题是:将1到10填入正五边形的顶点和边,使得每条边三数之和相等,求总的个数

思路:1  首先用暴力破解生成1~10的全排列list,对list进行判断,满足条件的存入新的list

            2  新list里面可能存在重复的解(因为是首尾相继的,无法判断从哪里开始),选定一个开始的数,将环状字符串切开,对字符串整体进行循环位移,用来判断是否重复

            3  位移后的字符串进行计数 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值