从一道无聊的奥数题发现Python真的爽翻了,感觉Pyhton无所不能啊

234 篇文章 6 订阅
125 篇文章 0 订阅

在其他平台我看到一张图片,里面的内容也引发了我的兴趣!

图片.png

Hmmm,这道题本身不难,只需要简单的推理就可以做出来:

  1. 3位数+3位数等于4位数,那么“要”只能是1。
  2. 同上,“好”+“要”>=10,因此“好”只能是9,“做”是0。
  3. 个位是两个“好”相加,于是“事”是8。

所以答案是,“要做好事”=1098。不过今天的重点并不在这里,因为我这张图片下方贴了一段代码,大概是有哪位家长无聊写的:

图片.png

小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

<pre>

void setup(){ 
Serial.begin(9600); 
Serial.println("Start"); 
for (int yao = 0; yao < 10; yao++) 
{ 
for (int zuo = 0; zuo < 10; zuo++) 
{ 
for (int hao = 0; hao < 10; hao++) 
{ 
for (int shi = 0; shi < 10; shi++) 
{ 
if (yao == zuo || yao == hao || yao == shi || zuo == hao || zuo == shi || hao == shi) 
continue;  
if (yao * 1000 + zuo * 100 + hao * 10 + shi == hao * 100 + shi * 10 + hao + yao * 100 + zuo * 10 + hao) 
{ Serial.print("Yao: "); 
Serial.print(yao); Serial.print(", Zuo: "); 
Serial.print(zuo); 
Serial.print(", Hao: "); 
Serial.print(hao); 
Serial.print(", Shi: "); 
Serial.println(shi); 
} 
} 
} 
} 
}
}
</pre>

哈哈哈哈果然程序员无处不在,居然要写代码来解这道题也是够无聊的。不过仔细看看这段代码貌似是Arduino的C吧,难道这位家长是搞单片机的?

Anyway,程序的思路很简单,用穷举法把所有的数字都试一遍,找出满足条件(加法等式)的组合。作为一个Python粉,我觉得这样的代码实在缺乏美感,特别是套了4层循环,而且还用了一个特别low的判断来检查4个数字是不是相互重复(根据题目,每个汉字代表一个不同的数字,所以相互之间不应该重复)。这道题目只是4位数,要是位数更多的话,这么写真的要累死啦。最后,如果你的时间不是很紧张,并且又想python快速的提高,最重要的是不怕吃苦,建议你可以扩我位xin 762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

那么用Python写这样一个程序,能不能简洁一点呢?我们换个思路,4个汉字,每个汉字的取值范围都是0-9,且相互之间不重复,这相当于从包含10个元素的集合[0,9]中任取4个元素的排列(permutation),即P(10,4)。学过排列组合的话我们就可以计算出P(10,4) = 10x9x8x7 = 5040,也就是说一共有5040种不同的排列方式。

Python里面有一个神器叫迭代器(iterator),而且Python还自带了itertools标准库,用来产生各种各样的迭代器,其中就包括排列组合迭代器。这样一来事情就简单了,我们先产生一个排列迭代器,然后再用for迭代它,就可以找出满足条件的排列了,不需要写4层循环,也不需要检查4个数字是否相互重复:

<pre>import itertoolsfor i in itertools.permutations
(map(str, range(10)), 4): 
if int('{0}{1}{0}'
.format(i[2], i[3])) + int(''.join(i[:3])) == int(''.join(i)): 
print('YAO:{},
ZUO:{}, 
HAO:{}, 
SHI:{}'.format(*i)) break</pre>

哇塞,爽爆了,只需要5行代码!而且其实最后一行break没有也无所谓,上面那段C的代码也没有做循环跳出嘛。运行一下看结果:

YAO:1, ZUO:0, HAO:9, SHI:8

完美!忽然发现自己也真的是很无聊呢。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值