python常見計算題型


HJ7 取近似值

描述

寫出一個程序,接受一個正浮點數值,輸出該數值的近似整數值。如果小數點后數值大於等於5,向上取整;小於5,則向下取整。

輸入描述:

輸入一個正浮點數值

輸出描述:

輸出該數值的近似整數值

from math import *
n=float(input())
def ceilNumber(n):
  a=(ceil(n)-n)
  if (a <=0.5) :
     print(ceil(n))
  else:
     print(floor(n))

ceilNumber(n)

輸入整型數組和排序標識,對其元素按照升序或降序進行排序

描述

輸入整型數組和排序標識,對其元素按照升序或降序進行排序

輸入描述:

第一行輸入數組元素個數
第二行輸入待排序的數組,每個數用空格隔開
第三行輸入一個整數0或1。0代表升序排序,1代表降序排序

輸出描述:

輸出排好序的數字

while True:
    try:
        a,b,c=input(),map(int,input().split()),input()
        print(" ".join(map(str,sorted(b))) if c=="0" else " ".join(map(str,sorted(b,reverse=True))))
    except:break

問題:map是怎么給變量賦值的,map返回的是啥,怎么讓不同類型快速轉化

HJ37 統計每個月兔子的總數 (這是斐波那契數列,不能用遞歸方式,因為會內存溢出)

有一只兔子,從出生后第3個月起每個月都生一只兔子,小兔子長到第三個月后每個月又生一只兔子,假如兔子都不死,問每個月的兔子總數為多少?

輸入描述:

輸入int型表示month

輸出描述:

輸出兔子總數int型

示例1

輸入:

9

輸出:

34
'''
這題如果采用遞歸,那當n比較大的時候,內存會溢出,所以采用循環列表方式做
'''
while True:
    try:
        month=int(input())
        list=[]
        for i in range(month):
            if i < 2:   #當小於2個月時,只有一只兔子
                cont=1
                list.append(cont) #所以,列表為[1,1]
            else:
                cont=list[i-1]+list[i-2]  #當大於2時,后面的數是前面的兩個數之和
                list.append(cont)  #追加入列表中假設i=2,這時候列表為[1,1,2]
        print(list[-1]) #最后采用逆向下標得出列表上最后一個元素L[-1]的值
    except:
        break

HJ38 求小球落地5次后所經歷的路程和第5次反彈的高度

描述

假設一個球從任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地時,共經歷多少米?第5次反彈多高?

最后的誤差判斷是小數點6位

輸入描述:

輸入起始高度,int型

輸出描述:

分別輸出第5次落地時,共經過多少米第5次反彈多高

示例1

輸入:

1

輸出:

2.875
0.03125
import sys
while True:
    try:
        h=float(input())
        s=h
        for i in range(4):
            s=s+h
            h=h/2
        s="%0.6f"%s
        h="%0.6f"%(h/2)
        print(s.rstrip('0'))
        print(h.rstrip('0'))
    except:
            #print(sys.exc_info())
            break
        

HJ50 四則運算

描述

輸入一個表達式(用字符串表示),求這個表達式的值。

保證字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表達式一定合法。

輸入描述:

輸入一個算術表達式

輸出描述:

得到計算結果

示例1

輸入:

3+2*{1+2*[-4/(8-6)+7]}

輸出:

25
while True:
    try:
        s = input().replace('{', '(').replace('}', ')').replace('[', '(').replace(']', ')')
        res = eval(s)
        print(int(res) if res == int(res) else res)
    except:
        break

完全數計算

描述

完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。

它所有的真因子(即除了自身以外的約數)的和(即因子函數),恰好等於它本身。

例如:28,它有約數1、2、4、7、14、28,除去它本身28外,其余5個數相加,1+2+4+7+14=28。s

輸入n,請輸出n以內(含n)完全數的個數。計算范圍, 0 < n <= 500000

本題輸入含有多組樣例。

輸入描述:

輸入一個數字n

輸出描述:

輸出不超過n的完全數的個數

示例1

輸入:

1000
7
100

輸出:

3
1
2
while True:
    try:
         n=int(input())
         L=[]
         for i in range(1,n):
             p=0
             for y in range(1,i):
                 if i%y==0:
                     p=p+y
             if i==p:
                 L.append(p)
         print(len(L))
    except:
        break 

配置文件恢復

描述

有6條配置命令,它們執行的結果分別是:

命 令 執 行
reset reset what
reset board board fault
board add where to add
board delete no board at all
reboot backplane impossible
backplane abort install first
he he unknown command

注意:he he不是命令。

為了簡化輸入,方便用戶,以“最短唯一匹配原則”匹配:
1、若只輸入一字串,則只匹配一個關鍵字的命令行。例如輸入:r,根據該規則,匹配命令reset,執行結果為:reset what;輸入:res,根據該規則,匹配命令reset,執行結果為:reset what;
2、若只輸入一字串,但本條命令有兩個關鍵字,則匹配失敗。例如輸入:reb,可以找到命令reboot backpalne,但是該命令有兩個關鍵詞,所有匹配失敗,執行結果為:unknown command
3、若輸入兩字串,則先匹配第一關鍵字,如果有匹配但不唯一,繼續匹配第二關鍵字,如果仍不唯一,匹配失敗。例如輸入:r b,找到匹配命令reset board 和 reboot backplane,執行結果為:unknown command。

4、若輸入兩字串,則先匹配第一關鍵字,如果有匹配但不唯一,繼續匹配第二關鍵字,如果唯一,匹配成功。例如輸入:b a,無法確定是命令board add還是backplane abort,匹配失敗。
5、若輸入兩字串,第一關鍵字匹配成功,則匹配第二關鍵字,若無匹配,失敗。例如輸入:bo a,確定是命令board add,匹配成功。
6、若匹配失敗,打印“unknown command”

輸入描述:

多行字符串,每行字符串一條命令

輸出描述:

執行結果,每條命令輸出一行

示例1

輸入:

reset
reset board
board add
board delet
reboot backplane
backplane abort
 

輸出:

reset what
board fault
where to add
no board at all
impossible
install first
while True:
    try:
        m=input().strip().split()
        key=["reset","reset board","board add","board delete","reboot backplane","backplane abort"]
        value=["reset what","board fault","where to add","no board at all","impossible","install first"]
        #key[2][:3] 'boa'
        #不建字典,是因為字典可能無序(3版又改動了),不方便確認是否唯一
        if len(m)<1 or len(m)>2:
            print("unknown command")
        elif len(m)==1:
            if m[0]==key[0][:len(m[0])]:
                print(value[0])
            else:
                print("unknown command")
        else:
            index=[]
            for i in range(1,len(key)):
                a=key[i].split()
                #print(a[0][:3])
                if m[0]==a[0][:len(m[0])] and m[1]==a[1][:len(m[1])]:
                    index.append(i)
            if len(index)!=1:
                print("unknown command")
            else:
                print(value[index[0]])
    except:
        break

HJ73 計算日期到天數轉換

描述

根據輸入的日期,計算是這一年的第幾天。

輸入描述:

輸入一行,每行空格分割,分別是年,月,日

輸出描述:

輸出是這一年的第幾天

示例1

輸入:

2012 12 31

輸出:

366
while True:
    try:
        import time
        year,month,day=map(int,input().split())
        if year <= 0 or month <=0 or day <=0 or month > 12 or day > 31:
            print(-1)
        else:
            m=[31,29,31,30,31,30,31,31,30,31,30,31]
            #判斷是否是閏年,閏年的2月有29天,不是閏年2月就是28天,閏年判斷標准就是四年一閏,百年不閏,四百年再閏
            if (year % 100 ==0 and year % 400 ==0 ) or (year %100 !=0 and year % 4 == 0):
                print(sum(m[:(month-1)])+day)
            else:
                m[1]=28
                print(sum(m[:(month-1)])+day)
    except:
        break

參數解析

描述

在命令行輸入如下命令:

xcopy /s c:\ d:\,

各個參數如下:

參數1:命令字xcopy

參數2:字符串/s

參數3:字符串c:\

參數4: 字符串d:\

請編寫一個參數解析程序,實現將命令行各個參數解析出來。

解析規則:

1.參數分隔符為空格
2.對於用""包含起來的參數,如果中間有空格,不能解析為多個參數。比如在命令行輸入xcopy /s "C:\program files" "d:"時,參數仍然是4個,第3個參數應該是字符串C:\program files,而不是C:\program,注意輸出參數時,需要將""去掉,引號不存在嵌套情況。
3.參數不定長
4.輸入由用例保證,不會出現不符合要求的輸入

輸入描述:

輸入一行字符串,可以有空格

輸出描述:

輸出參數個數,分解后的參數,每個參數都獨占一行

示例1

輸入:

xcopy /s c:\\ d:\\

輸出:

4
xcopy
/s
c:\\
d:\\
# 分情況處理即可

# 測試:xcopy /s "C:\program files" "d:\"
s = input().split() # 輸入一串字符,以空格分隔
res = [] # 解析結果列表
i = 0
while i in range(len(s)): # 遍歷列表s中的元素
    if s[i].count('"')==2: # 如果當前元素有兩個引號,說明該元素為一個完整的解析參數,直接添加即可
        res.append(s[i].replace('"', ''))
        i += 1
    elif s[i].count('"')==1: # 如果當前元素有一個引號,那么就要遍歷找到第二個引號才能添加該解析參數
        temp = s[i].replace('"', '') # 臨時變量
        for j in range(i+1, len(s)):
            if s[j].count('"')==1:
                temp = temp + ' ' + s[j].replace('"', '')
                break
            else:
                temp = temp + ' ' + s[j]
        res.append(temp)
        i = j+1
    else: #對於普通參數,無引號
        res.append(s[i])
        i += 1
print(len(res))
for i in res:
    print(i)

公共最大子串計算

描述

給定兩個只包含小寫字母的字符串,計算兩個字符串的最大公共子串的長度。

注:子串的定義指一個字符串刪掉其部分前綴和后綴(也可以不刪)后形成的字符串。

輸入描述:

輸入兩個只包含小寫字母的字符串

輸出描述:

輸出一個整數,代表最大公共子串的長度

示例1

輸入:

asdfas
werasdfaswer

輸出:

6
while True:
    try:
        str_1=input()
        str_2=input()
        p=0  #定義一個起始位置
        for i in range(len(str_1)):
            if str_1[i-p:i+1] in str_2: #p從0開始,如果匹配就加一,這樣最后看p.也就是說先一步一步移位找到第一個匹配的字符
                p+=1                
        print(p)
    except:
        break

尼克切斯定理

描述

驗證尼科徹斯定理,即:任何一個整數m的立方都可以寫成m個連續奇數之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

輸入一個正整數m(m≤100),將m的立方寫成m個連續奇數之和的形式輸出。

本題含有多組輸入數據。

輸入描述:

輸入一個int整數

輸出描述:

輸出分解后的string

示例1

輸入:

6

輸出:

31+33+35+37+39+41
while True:
    try:
        m=int(input())
        L=[]
        for i in range(1,m**3):
            if i%2 !=0:
                L.append(i)
                if m ** 3 == sum(L[-m:]):   #注意題目說的是m個連續奇數之和,也就是說他們是挨在一起的
                    L=L[-m:]
                    break
        result=str(L[0]) #定位第一個數
        for X in range(1,m):
            result += '+'+str(L[X])
        print(result)
    except:
        break

HJ83 二維數組操作

描述

有一個img大小的數據表,你會依次進行以下5種操作:

1.輸入imgimg,初始化img大小的表格。

2.輸入x_1x1、y_1y1、x_2x2、y_2y2,交換坐標在(x_1,y_1)(x1,y1)和(x_2,y_2)(x2,y2)的兩個數。

3.輸入img,在第img行上方添加一行。

4.輸入img,在第img列左邊添加一列。

5.輸入imgimg,查找坐標為img的單元格的值。

請編寫程序,判斷對表格的各種操作是否合法。

詳細要求:

1.數據表的最大規格為9行*9列,對表格進行操作時遇到超出規格應該返回錯誤。

2.對於插入操作,如果插入后行數或列數超過9了則應返回錯誤。如果插入成功了則將數據表恢復至初始化的img大小,多出的數據則應舍棄。

3.所有輸入坐標操作,對img大小的表格,行號坐標只允許0m-1,列號坐標只允許0n-1。超出范圍應該返回錯誤。

本題含有多組樣例輸入!

輸入描述:

輸入數據按下列順序輸入:
1 表格的行列值
2 要交換的兩個單元格的行列值
3 輸入要插入的行的數值
4 輸入要插入的列的數值
5 輸入要查詢的單元格的坐標

輸出描述:

輸出按下列順序輸出:
1 初始化表格是否成功,若成功則返回0, 否則返回-1
2 輸出交換單元格是否成功
3 輸出插入行是否成功
4 輸出插入列是否成功
5 輸出查詢單元格數據是否成功

示例1

輸入:

4 9
5 1 2 6
0
8
2 3
4 7
4 2 3 2
3
3
4 7

輸出:

0
-1
0
-1
0
0
-1
0
0
-1

說明:

本組樣例共有2組樣例輸入。
第一組樣例:
1.初始化數據表為4行9列,成功
2.交換第5行1列和第2行6列的數據,失敗。因為行的范圍應該是(0,3),不存在第5行。
3.在第0行上方添加一行,成功。
4.在第8列左邊添加一列,失敗。因為列的總數已經達到了9的上限。
5.查詢第2行第3列的值,成功。
第二組樣例:
1.初始化數據表為4行7列,成功
2.交換第4行2列和第3行2列的數據,失敗。因為行的范圍應該是(0,3),不存在第4行。
3.在第3行上方添加一行,成功。
4.在第3列左邊添加一列,成功。
5.查詢第4行7列的值,失敗。因為雖然添加了一行一列,但數據表會在添加后恢復成4行7列的形態,所以行的區間仍然在[0,3],列的區間仍然在[0,6],無法查詢到(4,7)坐標。   
while True:
    try:
        m, n = map(int, input().split())
        x1, y1, x2, y2=map(int,input().split())
        insert_x=int(input())
        insert_y=int(input())
        x,y=map(int,input().split())
        if (0 <= m <= 9) and (0 <= n <= 9):
            print('0')
        else:
            print('-1')
        if (0 <= x1 < m) and (0 <= y1 < n) and (0 <= x2 <= m)and (0 <= y2 < n):
            print('0')
        else:
            print('-1')
        if (0 <= insert_x < m) and (m < 9):
            print('0')
        else:
            print('-1')
        if (0 <= insert_y < n) and (n < 9):
            print('0')
        else:
            print('-1')
        if(0 <= x < m)and (0 <= y < n):
            print('0')
        else:
            print('-1')
    except:
        break

HJ85 最長回文子串

描述

給定一個僅包含小寫字母的字符串,求它的最長回文子串的長度。

所謂回文串,指左右對稱的字符串。

所謂子串,指一個字符串刪掉其部分前綴和后綴(也可以不刪)的字符串

(注意:記得加上while處理多個測試用例)

輸入描述:

輸入一個僅包含小寫字母的字符串

輸出描述:

返回最長回文子串的長度

示例1

輸入:

cdabbacc

輸出:

4

說明:

abba為最長的回文子串
while True:
    try:
        s = input()
        m = 0
        for i in range(len(s)):
            if i - m >= 1 and s[i-m-1:i+1] == s[i-m-1:i+1][::-1]:
                m += 2
            elif i - m >= 0 and s[i-m:i+1] == s[i-m:i+1][::-1]:
                m += 1
        if m != 0:
            print(m)
    except:
        break

HJ87 密碼強度等級

描述

密碼按如下規則進行計分,並根據不同的得分為密碼進行安全等級划分。

一、密碼長度:

5 分: 小於等於4 個字符

10 分: 5 到7 字符

25 分: 大於等於8 個字符

二、字母:

0 分: 沒有字母

10 分: 全都是小(大)寫字母

20 分: 大小寫混合字母

三、數字:

0 分: 沒有數字

10 分: 1 個數字

20 分: 大於1 個數字

四、符號:

0 分: 沒有符號

10 分: 1 個符號

25 分: 大於1 個符號

五、獎勵:

2 分: 字母和數字

3 分: 字母、數字和符號

5 分: 大小寫字母、數字和符號

最后的評分標准:

>= 90: 非常安全

>= 80: 安全(Secure)

>= 70: 非常強

>= 60: 強(Strong)

>= 50: 一般(Average)

>= 25: 弱(Weak)

>= 0: 非常弱

對應輸出為:

VERY_SECURE

SECURE

VERY_STRONG

STRONG

AVERAGE

WEAK

VERY_WEAK

請根據輸入的密碼字符串,進行安全評定。

注:

字母:a-z, A-Z

數字:0-9

符號包含如下: (ASCII碼表可以在UltraEdit的菜單view->ASCII Table查看)

!"#$%&'()*+,-./ (ASCII碼:0x21~0x2F)

:;<=>?@ (ASCII碼:0x3A~0x40)

[]^_` (ASCII碼:0x5B~0x60)

{|}~ (ASCII碼:0x7B~0x7E)

提示:

1 <= 字符串的長度<= 300

輸入描述:

本題含有多組輸入樣例。
每組樣例輸入一個string的密碼

輸出描述:

每組樣例輸出密碼等級

示例1

輸入:

38$@NoNoNo
123

輸出:

VERY_SECURE
WEAK

說明:

第一組樣例密碼強度為95分。
第二組樣例密碼強度為25分。    
while True:
    try:
        str_data = input().strip()
        num, up_char, low_char, other, score = 0, 0, 0, 0, 0

        for data in str_data:
            if data.isdigit():
                num += 1
            elif data.isalpha():
                if data.lower() == data:
                    low_char += 1
                else:
                    up_char += 1
            else:
                other += 1
        if len(str_data) < 5:
            score += 5
        elif len(str_data) < 8:
            score += 10
        else:
            score += 25
        if up_char==0 and low_char==0:
            pass
        elif (up_char==0 and low_char!=0) or (up_char!=0 and low_char==0):
            score += 10
        else:
            score += 20
        if num == 0:
            pass
        elif num == 1:
            score += 10
        else:
            score += 20
        if other == 0:
            pass
        elif other == 1:
            score += 10
        else:
            score += 25
        if num != 0 and (up_char+low_char) != 0 and other==0:
            score += 2
        elif num != 0 and up_char != 0 and low_char != 0 and other!=0:
            score += 5
        elif num != 0 and (up_char+low_char) != 0 and other!=0:
            score += 3
        if score >=90:
            print('VERY_SECURE')
        elif score >=80:
            print('SECURE')
        elif score >= 70:
            print('VERY_STRONG')
        elif score >= 60:
            print('STRONG')
        elif score >= 50:
            print('AVERAGE')
        elif  score>=25:
            print('WEAK')
        else:
            print('VERY_WEAK')
    except:
        break

走方格的方案數

描述

請計算n*m的棋盤格子(n為橫向的格子數,m為豎向的格子數)沿着各自邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即:只能往右和往下走,不能往左和往上走。

本題含有多組樣例輸入。

輸入描述:

每組樣例輸入兩個正整數n和m,用空格隔開。(1≤n,m≤8)

輸出描述:

每組樣例輸出一行結果

示例1

輸入:

2 2
1 2

輸出:

6
3
while True:
    try:
        m,n = map(int,input().split())  # m為行數,n為列數
        c = [[1 for i in range(n+1)] for j in range(m+1)]  # 隱含了邊界條件初始化
        for i in range(1,m+1):  # 轉換為求解從右下角走到左上角的路徑數
            for j in range(1,n+1):
                c[i][j] = c[i-1][j] + c[i][j-1]
        print(c[m][n])
    except:
        break

記負均正

描述

首先輸入要輸入的整數個數n,然后輸入n個整數。輸出為n個整數中負數的個數,和所有正整數的平均值,結果保留一位小數。

0即不是正整數,也不是負數,不計入計算

輸入描述:

本題有多組輸入用例。

首先輸入一個正整數n,
然后輸入n個整數。

輸出描述:

輸出負數的個數,和所有正整數的平均值。

示例1

輸入:

5
1 2 3 4 5
10 
1 2 3 4 5 6 7 8 9 0

輸出:

0 3.0
0 5.0
while True:
    try:
        num = int(input())
        li = list(map(lambda x:int(x), input().split()))
    except EOFError:
        break
    print(len(list(filter(lambda x:x<0, li))), end=" ")
    postives = list(filter(lambda x:x>0, li))
    print(round(sum(postives)/len(postives),1) if postives else 0.0)

HJ108 求最小公倍數

描述

正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值,設計一個算法,求輸入A和B的最小公倍數。

輸入描述:

輸入兩個正整數A和B。

輸出描述:

輸出A和B的最小公倍數。

示例1

輸入:

5 7

輸出:

35
a, b = map(int, input().split())
def gy(a, b):
    while (b != 0):
        c = a % b
        a = b
        b = c

    return a
print(int((a * b) / gy(a, b)))

這是常規擴大倍數求交際方法

while True:
    try:
        a,b=map(int,input().split())
        C=[]
        D=[]
        E=[]
        for i in range(1,100000):
            c=a*i
            C.append(c)
            d=b*i
            D.append(d)         
        C=set(C)
        D=set(D)
        E=C&D
        E=list(E)
        E.sort()
        print(E[0])        
    except:
        break

大數翻倍法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM