zoukankan      html  css  js  c++  java
  • 华为机试:大数相加,相乘,幂运算

    1.大数相加

    思路:

    两个数字转换为字符串,为了便于操作,分别逆转字符串,将短的字符串补上‘0’,使得长度相等。各个位分别相加,处理进位问题。最后再将结果倒置,从第一个不为0的字符开始输出

    代码:

    #reverse返回一个迭代器,用list()
    s1=list(reversed(num1))
    s2=list(reversed(num2))
    
    if len(s1)>len(s2):
        for i in range(len(s1)-len(s2)):
            s2.append('0')
    else:
        for i in range(len(s2)-len(s1)):
            s1.append('0')
    print(s1,s2)
    ans=[0]*(len(s1)+1)
    
    
    for i in range(len(s1)):
    
        sum = int(s1[i]) + int(s2[i])+ans[i]
        if(sum>9):
            ans[i+1]=ans[i+1]+sum//10
    
        ans[i] = sum % 10
    
    ans=list(reversed(ans))
    print(ans)
    i=0
    flag=0
    for i in range(len(ans)):
        if ans[i] != 0 and flag==0:
            break
    
        if ans[i]!=0:
            flag=1
        else:
            flag=0
    
    while i<len(ans):
        print(ans[i],end='')
        i=i+1
    

    2.大数相乘

    思路:

    与大数相加类似,模拟乘法,n位数*m位数,结果为n+m位数。先算出每一位的数,最后处理进位。

    代码:

    in1=input('').split(' ')
    num1=in1[0];
    num2=in1[1];
    s1=list(reversed(num1))
    s2=list(reversed(num2))
    
    if len(s1)>len(s2):
        for i in range(len(s1)-len(s2)):
            s2.append('0')
    else:
        for i in range(len(s2)-len(s1)):
            s1.append('0')
    print(s1,s2)
    ans=[0]*(max(len(s1),len(s2))*2)
    for i in range(min(len(s1),len(s2))):
        for j in range(max(len(s1),len(s2))):
            if len(s1)>len(s2):
                ans[i+j]+=int(s1[j])*int(s2[i])
            else:
                ans[i+j]+=int(s1[i])*int(s2[j])
            #print(ans[i])
    #print(ans)
    for i in range(len(ans)):
        temp=ans[i]
        ans[i]=temp%10
        if temp>9:
            ans[i+1]+=temp//10
    
    print(ans)
    ans=list(reversed(ans))
    print(ans)
    i=0
    flag=0
    while 1:
        if ans[i]!=0 and flag==0:
            break
        i+=1
    #print(i)
    while i!=len(ans):
        print(ans[i],end='')
        i+=1
    
    

    3幂运算

    思路:n**k,n*n循环k次,转为乘法

    for i in range(k-1):
        ans=bignumMul(ans,n)
    
  • 相关阅读:
    hdu 14004
    hdu 1850 基础尼姆博奕
    hdu 1847 sg函数
    hdu 2177
    hdu 1527
    hdu 2897
    hdu 2516 取石子游戏
    hdu 1525 Euclid's Game
    hdu 2063
    hdu 1281 棋盘游戏
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12309939.html
Copyright © 2011-2022 走看看