MENU

一元一次方程的改良与求解

April 4, 2020 • 算法,题解

题目来源:洛谷P1022 题目链接

这里我使用了Python来求解这道题,其中使用了

  1. eval()函数
  2. re.sub()函数
那么首先来讲讲 eval() 函数,这个函数可以将字符串转化为可以运行的表达式
  1. 将字符串转换为可以用于计算的式子,例如:
dict_1={'a':1,'b':2}
print(eval("a+b"),dict_1)
#输出为 3
dict_1={'a':1,'b':2}
print(eval("a+b",{'a':6}))
#输出结果 8
a=2
b=3
print(eval("a+b"))
#输出结果5
  1. 可以实现列表,字典,元祖与字符串的相互转化,例如:
dict_1="{'a':1,'b':2}"
dict_2=eval(dict_1)
print(type(dict_2))
#输出结果为:<class 'dict'>
list_1="[1,2,3]"
list_2=eval(list_1)
print(type(list_2))
#输出结果为:<class 'list'>
tuple_1="(1,2,3)"
tuple_2=eval(tuple_1)
print(type(tuple_2))
#输出结果为:<class 'tuple'>

但是值得注意的是eval()在使用的时候会伴随着一系列的安全性问题

接下来我们再来看看re.sub()函数

使用这个函数时记得要先导入正则表达式的库 re
re.sub(匹配的正则,替换的字符,被匹配的字符)
其中被匹配的正则是可以是一个函数(在re.sub函数中,会自动向第二个函数中传递一个参数,参数为被匹配的字符),使用方法如下:

import re
string="hello 123"
replaced=re.sub("(?P<name>\d+)",addn,string)
#name是族群名字
def addn(matched):
    str_1=matched.group("name")
    #str_1便是被匹配到的字符
    int_1=int(str_1)
    int_1+=12
    return str(int_1)

print(replaced)
#输出结果是:hello 135
那么如何写出一元一次方程的改良呢?

思路如下:

  1. 首先对输入的字符串进行修剪,将其转换为计算机可以运行的算式
  2. 然后通过eval函数对其进行求解

那么代码呢?

import re

string=input("")+" "

def soul(string,value):
    str_1=string.replace("=","-(")+")"
    r=eval(str_1,{value:1j})
    out=(str(value)+"=")
    print("%s=%.3f" % (str(value),(-r.real/r.imag)))

def get_un(string):
    '''获取未知数'''
    pattern=re.compile("[a-z]")
    value=pattern.findall(string)[0]
    return value

value=get_un(string)

def deal(string):
    '''对方程进行加工'''
    replaced=re.sub("(?P<number>\d+)",addn,string)
    return replaced
    
def addn(matched):
    str_1=matched.group("number")
    place=matched.span()[1]
    global string
    global value
    if string[place]==value:
        str_2=str_1+"*"
    else:
        str_2=str_1
    return str_2

if __name__=="__main__":
    replaced=deal(string)
    soul(replaced,value)

作者:NorthCity1984
出处:https://grimoire.cn/algorithm/equation.html
版权:本文《一元一次方程的改良与求解》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

Last Modified: March 7, 2022