真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么用Python寫算法題

這篇文章給大家介紹怎么用Python寫算法題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

為特克斯等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及特克斯網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、特克斯網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

題目

題目描述

給你n根火柴棍,你可以拼出多少個(gè)形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整數(shù)(若該數(shù)非零,則最高位不能是00)。用火柴棍拼數(shù)字0-90?9的拼法如圖所示:
怎么用Python寫算法題

注意:

  1. 加號(hào)與等號(hào)各自需要兩根火柴棍

  2. 如果A≠B,則A+B=C與B+A=C視為不同的等式(A,B,C>=0)

  3. n根火柴棍必須全部用上

輸入格式

一個(gè)整數(shù)n(n<=24)。

輸出格式

一個(gè)整數(shù),能拼成的不同等式的數(shù)目。

輸入輸出樣例

樣例1:

輸入

14

輸出

2

樣例2

輸入

18

輸出

9

解法

方法1:打表法

因?yàn)閚的最大值只有24,那么可以直接提前把答案窮舉出來。

# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

# 輸入一個(gè)數(shù),計(jì)算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c

result = [0] * 24

for n in range(10, 25): #10根火柴以下都是0,很明顯
    print("caculate ", n)
    for i in range(0, 10000): #假設(shè)單個(gè)數(shù)字最大值為10000
        for j in range(0, 10000):
            if count(i) + count(j) + count(i+j) == n - 4:
                result[n-1] += 1
print(result)

上述代碼在我的電腦上跑半天也出不來,最大值改成2000就可以。同樣的代碼,用Java很快就出結(jié)果了,足以說明Python并不適合這一類的題目。

public class Test {
    public static void main(String[] args) {
        int[] result = new int[24];
        for(int i = 10; i <= 24; i++) {
            for(int j = 0; j < 10000; j++) {
                for(int k = 0; k < 10000; k++) {
                    if(count(j) + count(k) + count(j+k) == i - 4) {
                        result[i] += 1;
                    }
                }
            }
        }
        for(int i = 0; i < 24; i++) {
            System.out.println(result[i]);
        }

    }
    public static int[] num = {6,2,5,5,4,5,6,3,7,6};
    public static int count(int x) {
        if(x == 0) {
            return 6;
        }
        int c = 0;
        while (x > 0) {
            int digit = x % 10;
            c += num[digit];
            x = x / 10;
        }
        return c;
    }
}

最后結(jié)果是{0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65,88,128}。

但是雖然是窮舉,但是上面代碼有個(gè)問題,每次都要重復(fù)調(diào)用count,提前把count存起來就行了,雖然用Python還是很慢,但是能夠在可接受時(shí)間內(nèi)出結(jié)果。

# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

# 輸入一個(gè)數(shù),計(jì)算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c

COUNT = [0] * 20000
for i in range(0, 20000):
    COUNT[i] = count(i)

result = [0] * 24

for n in range(10, 25):
    print("caculate ", n)
    for i in range(0, 10000):
        for j in range(0, 10000):
            if COUNT[i] + COUNT[j] + COUNT[i+j] == n - 4:
                result[n-1] += 1
print(result)

方法2:優(yōu)化上述方法

沒有什么更好的方法,我們可以盡量減少循環(huán)次數(shù),另外,如果能知道單個(gè)數(shù)的最大值,那就更好辦了。

要想用最少的火柴棒拼出最大的數(shù),那優(yōu)先得拼出最大的數(shù)字個(gè)數(shù),因?yàn)?99肯定要比1111小,因?yàn)橐粋€(gè)數(shù)字至少2個(gè)火柴,所以對(duì)于偶數(shù)個(gè)火柴,肯定是用拼成11111這樣的最大,例如10根火柴,能拼出的最大數(shù)是11111,20個(gè)火柴,能拼出的最大數(shù)是1111111111。

假設(shè)最大值超過10000,那至少需要10根,能拼出11111,剩下10根分成8+2根,兩個(gè)湊起來不可能超過10000,所以最大值不超過10000。

假設(shè)最大值可能位于[9000,10000),至少需要12根,能拼出9111,剩下8根不可能加起來等于這個(gè)數(shù)。

假設(shè)最大值可能位于[8000,9000),至少需要13根,更不可能。

假設(shè)最大值可能位于[7000,8000),至少需要9根,也就是7111,剩下11根,,如果分成9+2,2根只能是1,所以9根必須拼成7110,不夠數(shù)。

假設(shè)最大值可能位于[6000,7000),至少需要12根,剩下8根也不行。

假設(shè)最大值可能位于[5000,6000),至少需要11根,剩下9根能拼出的最大4位數(shù)是7xxx或者1xxx,加起來不可能是5000。對(duì)于[2000,5000)也一樣。

假設(shè)最大值可能位于[1900,2000],那么最少需要12根,1911,剩下的沒法相加為1911。

依次分析,我們發(fā)現(xiàn)最大數(shù)不可能大于1111。通過程序結(jié)果來看,最大值為712。

改進(jìn)之后,不用打表也能AC。

# 0-9需要多少根火柴棒
num =[6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

# 輸入一個(gè)數(shù),計(jì)算需要多少火柴棒
def count(x):
    if x == 0:
        return 6
    c = 0
    while x > 0:
        digit = x % 10
        c += num[digit]
        x = x // 10
    return c

COUNT = [0] * 713
for i in range(0, 713):
    COUNT[i] = count(i)

result = 0

n = int(input())

for i in range(0, 712):
    for j in range(0, 712):
        if i + j > 712:
            continue
        if COUNT[i] + COUNT[j] + COUNT[i+j] == n - 4:
            result += 1

print(result)

關(guān)于怎么用Python寫算法題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


名稱欄目:怎么用Python寫算法題
標(biāo)題來源:http://weahome.cn/article/jjiphe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部