51Nod 1005 大数加法
来源:互联网 发布:c语言怎么实现多线程 编辑:程序博客网 时间:2024/06/07 07:26
两个超长带符号数字相加这道题,是51Nod的第一题。虽然简单,其关键在于完整的考虑各种边界情况:
1.加法进位后可能会造成多出一位的情况;
2.减法借位后可能导致前N个值都为0,需要剔除;
3.由于按位加减法时是将数字反序进行排列的,剔除0时需要(反序的反序)来进行。
4.range的起始和结束字符需要慎重考虑
5.int和str的类型转换
#coding:utf-8def rev(a): if a[0]=='-': flag='-' return a[1:],flag else: flag='' return a,flagdef bigadd_sub(a,b): #大数加法 alist = list(a[::-1]) blist = list(b[::-1]) for j in range(0,len(alist)): if (j<len(blist)): alist[j] = int(alist[j]) + int(blist[j]) if int(alist[j])>=10: if j==len(alist)-1: alist.append(1) else:alist[j+1] =int(alist[j+1])+1 alist[j] = alist[j] - 10 c=''.join(str(s) for s in alist) return cdef bigsubstract_sub(a,b): #大数减法 alist = list(a[::-1]) blist = list(b[::-1]) for j in range(0,len(alist)): if (j<len(blist)): alist[j] = int(alist[j]) - int(blist[j]) if int(alist[j])<0: alist[j+1] =int(alist[j+1])-1 alist[j] = alist[j] + 10 for j in range(len(a)-1,-1,-1): #range的有效范围形如[0,1) if alist[j]==0:alist.pop() else:break c=''.join(str(s) for s in alist) return cdef markcompare(a,b): #比较a,b的符号值 if a==b: return True else: return Falsedef comparebig(a,b): #比较两个绝对数的大小 length1 = len(a) length2 = len(b) if length1>length2: return 1; elif length2>length1: return 2; else: for i in range(0,length1): if a[i]>b[i]: return 1; elif b[i]>a[i]: return 2 else: continue return 1def bigadd(num1,num2): #真实调用的主体函数。 revnum1, flag1 = rev(num1) revnum2, flag2 = rev(num2) tag = comparebig(revnum1, revnum2) marktag=markcompare(flag1, flag2) if (marktag==True and tag==1): sumtemp=bigadd_sub(revnum1,revnum2) return flag1+sumtemp[::-1] elif (marktag==True and tag==2): sumtemp=bigadd_sub(revnum2,revnum1) return flag2+sumtemp[::-1] elif (marktag==False and tag==1): sumtemp=bigsubstract_sub(revnum1,revnum2) return flag1+sumtemp[::-1] else: sumtemp = bigsubstract_sub(revnum2, revnum1) return flag2 + sumtemp[::-1]num1 = input()num2 = input()ans=bigadd(num1,num2)print(ans)
说明:类型转换需要大量的时间。如果进一步优化时间,则应当考虑使用纯字符串格式进行计算(即利用0-9的ascii码格式进行计算)
0 0
- 51nod-1005 大数加法
- 51nod 1005《《大数加法》》
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 【51nod】1005 大数加法
- 51Nod 1005 大数加法
- 51Nod--1005 大数加法
- 51Nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51Nod-1005-大数加法
- 51Nod-1005-大数加法
- 51Nod 1005 大数加法
- 51Nod 1005 大数加法
- 51nod 1005 大数加法 大数运算
- 括号匹配及其变形
- mongodb3.0+导出库导入库
- NOIP 2004 提高组 复赛 chorus 合唱队形
- ReactNative系列之十三WebStorm的JSX语法配置及自动补全设置
- 330. Patching Array(Hard)
- 51Nod 1005 大数加法
- 排列组合_排列_数学公式
- Latex学习过程
- 不借助中间变量交换两个数
- 慕课网jQuery学习笔记(二)
- IMWeb训练营-VUE-CustomSelectComponent
- 【IMWeb训练营作业】select组件
- Java WebService接口生成和调用 图文详解
- 对夹逼定理的理解