重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
(1) variable = a if exper else b
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了武陟免费建站欢迎大家使用!
(2)variable = (exper and [b] or [c])[0]
(2) variable = exper and b or c
上面三种用法都可以达到目的,类似C语言中 variable = exper ? b : c;即:如果exper表达式的值为true则variable = b,否则,variable = c
例如:
a,b=1,2
max = (a if a b else b)
max = (a b and [a] or [b])[0] #list
max = (a b and a or b)
现在大部分高级语言都支持“?”这个三元运算符(ternary operator),它对应的表达式如下:condition ? value if true : value if false。很奇怪的是,这么常用的运算符python居然不支持!诚然,我们可以通过if-else语句表达,但是本来一行代码可以完成的非要多行,明显不够简洁。没关系,在python里其实还是有对应的表达方式的。
完全的暴力:
i=0
while (~i1) or (i%3!=2) or (i%5!=4) or (i%6!=5):
i+=7
print i
考虑数学上的优化——
设阶梯数为x,则可联立以下同余方程:
x=1(mod 2)
x=2(mod 3)
x=4(mod 5)
x=5(mod 6)
x=0(mod 7)
前四个同余方程又可改写为:
x=2-1=-1(mod 2)
x=3-1=-1(mod 3)
x=5-1=-1(mod 5)
x=6-1=-1(mod 6)
联立得:x=-1(mod lcm(2,3,5,6)=30)
交上最后一个同余方程得:x%30==29且x%7==0
到这步时,便可以再打一个暴力:
i=0
while i%30!=29:
i+=7
print i
考虑继续优化——
原同余方程又可改写为:
x=30*m+29(m∈N)
x=7*n(n∈N+)
联立得:
30*m+29=7*n
即:n=(30*m+29)/7=4*m+4+(2*m+1)/7
∵n∈N+
∴(2*m+1)/7∈N
∴m=3(mod 7)
∴m最小为3,n最小为17,x最小为119
于是有O(1)的程序:
print 119
方法/步骤
用Python解数学方程,需要用到Python的一个库——SymPy库。
SymPy是符号数学的Python库,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。
如果你的电脑上还没有安装sympy库,那就赶紧安装吧,安装命令:
pip3 install sympy
请点击输入图片描述
先来解一个简单点的方程吧。
题目: 5x + 20 = 100
先直接上代码:
from sympy import *
x = Symbol('x')
print(solve([5*x + 20 - 100], [x]))
请点击输入图片描述
再来一个复杂点的二元一次方程吧。
题目:3x + 4y =49, 8x- y = 14
代码如下:
from sympy import *
x = Symbol('x')
y = Symbol('y')
print(solve([3*x + 4*y - 49, 8*x - y - 14], [x, y]))
请点击输入图片描述
有没有发现规律呢,简单总结一下:
1)变量赋值,使用symbol函数转换;
2)将方程式移到方程的左边,使右边等于0;
3)使用solve函数解方程。
当然了,python的基础语法必须掌握,至少需要掌握python最基础的算数运算符。
+ 加 ---- 两个对象相加
- 减 ----- 得到负数或是一个数减去另一个数
* 乘 ----- 两个数相乘或是返回一个被重复若干次的字符串
/ 除 ----- x 除以 y
% 取模 ----- 返回除法的余数
** 幂 ----- 返回x的y次幂
log() 对数-----对数 log()
下面来个难度大点的方程。
请点击输入图片描述
代码如下:
from sympy import *
t = Symbol('t')
x = Symbol('x')
m = integrate(sin(t)/(pi-t), (t, 0, x))
print(integrate(m, (x, 0, pi)))
请点击输入图片描述
def erfen(low,high):
while low high:
mid=(low+high)/2
if f(low)*f(mid)0:
high=mid
elif f(mid)*f(high )0:
low=mid
return mid
这个函数没有结束 检查一下如何设置退出条件