1060 Are They Equal
题目大意:给出连个数和一个精度位数,用科学计数法表示这两个数,如果相同则输出YES+科学记数法表示的数;否则输出NO+各自的科学记数法
思路:找出小数点和第一个有效数字,然后比较两者顺序,记录下n个有效数字,按格式输出即可。注意这里坑点挺多,像是小数点在有效数字后面输出时候得处理掉小数点,0的输出,指数负数的输出,前导0的处理等等,还是有点麻烦的
def isZero(s): #判断字符串是否全部为0
n=len(s)
for i in range(n):
if s[i]!='0' and s[i]!='.':
return False
return True
def findFirstValidDigit(s): #找到第一位有效数字
index=-1
for i in range(len(s)):
if s[i]!='.' and s[i]!='0':
index=i
break
return i
def changeForm(s,n): #转换成标准写法
point=s.find('.')
ret="0."
if isZero(s):
ret+='0'*n+"*10^0"
else:
start=findFirstValidDigit(s)
new_s=""
index=start
cnt=0
while cnt<n: #这里有效数字后面可能会含有小数点,需要处理一下
if s[index]!='.':
new_s+=s[index]
cnt+=1
index+=1
s=s[start:]
if point==-1: #不存在小数点
ret+=(new_s if len(new_s)==n else new_s+'0'*(n-len(new_s)))+"*10^"+str(len(s))
else: #小数
if point<start: #小数点在有效数字前面
ret+=(new_s if len(new_s)==n else new_s+'0'*(n-len(new_s)))+"*10^"+str(point-start+1)
else: #小数点在有效数字后面
ret+=(new_s if len(new_s)==n else new_s+'0'*(n-len(new_s)))+"*10^"+str(point-start)
return ret
n,a,b=input().split()
n=int(n)
new_a,new_b=changeForm(a,n),changeForm(b,n)
if new_a==new_b:
print("YES",new_a,end="")
else:
print("NO",new_a,new_b,end="")