一人一python挑戰題解

OpenSoucre發表於2013-11-09

 

題目id: 1 just print a+b

give you two var a and b, print the value of a+b, just do it!!

print a+b

題目id:  2 list排序

給你一個list L, 如 L=[2,8,3,50], 對L進行升序排序並輸出

print sorted(L)

題目id: 3  字串逆序

給你一個字串 a, 如a=‘12345’,對a進行逆序輸出a。

print a[::-1]

題目id:4   輸出字典key

給你一字典a,如a={1:1,2:2,3:3},輸出字典a的key,以','連結,如‘1,2,3'。

print ','.join(a.keys())

 

題目id:  5  輸出字元奇數位置的字串

給你一個字串 a, 輸出字元奇數位置的字串。如a=‘12345’,則輸出135。

str1=''
for i in range(len(a)):
    if i%2==0:
        str1 += str(a[i])
print str1

 

題目id:6  求解100以內的所有素數

輸出100以內的所有素數,素數之間以一個空格區分

import math
def isPrime(n):
    if n<=1:
        return False
    for i in range(2,int(math.sqrt(n))+1):
        if n%i == 0:
            return False
    return True
list = []
for i in range(1,100):
    if isPrime(i):
        list.append(str(i))
print ' '.join(list)

 題目id:7  求矩形面積

已知矩形長a,寬b,輸出其面積和周長,面積和周長以一個空格隔開

print "%d %d"%(a*b,2*(a+b))

 題目id:8  求中位數

給你一個list L, 如 L=[0,1,2,3,4], 輸出L的中位數(若結果為小數,則保留一位小數)。

n = len(L) 
L.sort()     //注意sorted()函式和sort()函式的區別,sorted()不影響L的結構,而sort()影響L的結構
print (L[n/2] if n&1 else round(float(L[n/2-1]+L[n/2])/2,1))

題目id:9  最大公約數

給你兩個正整數a和b, 輸出它們的最大公約數。

def gcd(a,b):
    if a < b:
        a,b = b,a
    while b:
        a,b=b,a%b
    return a
print gcd(a,b)

題目id:10  最小公倍數

給你兩個正整數a和b, 輸出它們的最小公倍數

def gcd(a,b):
    if a < b:
        a,b = b,a
    while b:
        a,b=b,a%b
    return a
print a*b/gcd(a,b)

題目id:11  結尾0的個數

給你一個正整數列表 L, 如 L=[2,8,3,50], 輸出L內所有數字的乘積末尾0的個數,

def getFactorNum(num,factor):
    cnt = 0
    while num%factor == 0:
        cnt+=1
        num /=factor
    return cnt
fiveNum = 0
twoNum = 0
for num in L:
    fiveNum += getFactorNum(num,5)
    twoNum += getFactorNum(num,2)
print min(fiveNum,twoNum)

題目id:12  結尾非零數的奇偶性

給你一個正整數列表 L, 如 L=[2,8,3,50], 判斷列表內所有數字乘積的最後一個非零數字的奇偶性,

def getFactorNum(num,factor):
    cnt = 0
    while num%factor == 0:
        cnt+=1
        num /=factor
    return cnt
fiveNum = 0
twoNum = 0
for num in L:
    fiveNum += getFactorNum(num,5)
    twoNum += getFactorNum(num,2)
print ( 1 if fiveNum >= twoNum else 0)

題目id:13  光棍的悲傷

給你一個整數a,數出a在二進位制表示下1的個數,並輸出。

cnt = 0
while a:
    cnt += a&1
    a >>= 1
print cnt

題目id:14  Python之美

輸出Python之禪
注意:輸出python之禪的原始碼即可,不用轉換為英文。

import this
print this.s

題目id:15  大小寫轉換

給定一個字串a, 將a中的大寫字母 轉換成小寫,其它字元不變,並輸出。

print a.lower()

題目id:16 人民幣金額列印

銀行在列印票據的時候,常常需要將阿拉伯數字表示的人民幣金額轉換為大寫表示,現在請你來完成這樣一個程式。
在中文大寫方式中,0到10以及100、1000、10000被依次表示為:
零壹貳叄肆伍陸柒捌玖拾佰仟萬
以下的例子示範了阿拉伯數字到人民幣大寫的轉換規則:

1 壹圓
11 壹拾壹圓
111 壹佰壹拾壹圓
101 壹佰零壹圓
-1000 負壹仟圓
1234567 壹佰貳拾叄萬肆仟伍佰陸拾柒圓

現在給你一個整數a(|a|<100000000), 列印出人民幣大寫表示

d={0:'',1:'',2:'',3:'',4:'',5:'',6:'',7:'',8:'',9:''}
unit = {0:'',1:'',2:'',3:'',4:''}
b = abs(a)
def transferMoney(b,s,outOfRange):
    s.append('') if outOfRange else s.append('')
    cnt = 0
    flag = False
    if b == 0: 
        s.append(d[0])
    else:
        while b:
            if b%10:
                flag = True
                s.append(unit[cnt])
            if flag:
                s.append(d[b%10])
            b/=10
            cnt+=1
s=[]
transferMoney(b%10000,s,False)
if b >= 10000:
    transferMoney(b/10000,s,True)

if a < 0:
    s.append('')
print "".join(s[::-1])

題目id:17 公約數的個數

 給你兩個正整數a,b,  輸出它們公約數的個數。

def gcd(a,b):
    if a < b:
        a,b = b,a
    while b:
        a,b = b,a%b
    return a
cnt = 1
for i in range(1,gcd(a,b)):
    if a%i == 0 and b%i ==0:
        cnt +=1
print cnt

題目id:18    逆解最大公約數與最小公倍數

我們經常遇到的問題是給你兩個數,要你求最大公約數和最小公倍數。
今天我們反其道而行之,給你兩個數a和b,計算出它們分別是哪兩個數的最大公約數和最小公倍數。
輸出這兩個數,小的在前,大的在後,以空格隔開。若有多組解,輸出它們之和最小的那組。

import sys
def gcd(a,b):
    if a < b:
        a,b = b,a
    while b:
        a,b = b,a%b
    return a

c= b/a+1
minv,mina,minb= sys.maxint,0,0
for i in range(1,c):
    for j in range(i,c):
        if gcd(i,j) == 1 and a*i*j == b:
            if minv > (a*i+a*j):
                minv,mina,minb = (a*i+a*j),a*i,a*j
print '%d %d'%(mina,minb)

題目id:19  單身情歌

抓不住愛情的我
總是眼睜睜看它溜走
...

現在來練習一下發現愛的能力,給你一個字串a,如果其中包含"LOVE"(love不區分大小寫)則輸出LOVE,否則輸出SINGLE。

print ("LOVE" if "love" in a.lower() else "SINGLE" )

題目id:20 資訊加密

給你個小寫英文字串a和一個非負數b(0<=b<26), 將a中的每個小寫字元替換成字母表中比它大b的字母。
這裡將字母表的z和a相連,如果超過了z就回到了a。例如a="cagy",b=3, 則輸出 fdjb

c=[]
for letter in a:
    if letter.islower():
        c.append(chr((ord(letter)+b-97)%26+97))
    else:
        c.append(letter)
print "".join(c)

題目id:21  迴文子串

給你一個字串a和一個正整數n,判斷a中是否存在長度為n的迴文子串。如果存在,則輸出YES,否則輸出NO。
迴文串的定義:記串str逆序之後的字串是str1,若str=str1,則稱str是迴文串,如"abcba".

def is_palindrome(a):
    return (True if a == a[::-1] else False)

for index in range(len(a)-n+1):
    if is_palindrome(a[index:index+n]):
        print 'YES'
        break
else:
    print 'NO'

題目id:22  時間就是金錢

給你兩個時間st和et(00:00:00<=st <= et<=23:59:59), 請你給出這兩個時間間隔的秒數。
如:st="00:00:00", et="00:00:10", 則輸出10.

stTime = st.split(':')
etTime = et.split(':')
hour,minute,second = int(etTime[0])-int(stTime[0]),int(etTime[1])-int(stTime[1]),int(etTime[2])-int(stTime[2])
print hour*3600+minute*60+second

題目id:23  365 Or 366?

一年有多少天,這是個大問題,很值得思考。現在給你一個年份year(year為四位數字的字串,如"2008","0012"),
你輸出這一年的天數。如year="2013", 則輸出365。

def isLeapYear(year):
    return (year%4 == 0 and year%100 )or year%400 == 0
print (366 if isLeapYear(int(year)) else 365)

題目id:24  一馬當先

下過象棋的人都知道,馬只能走'日'字形(包括旋轉90°的日),現在想象一下,給你一個n行m列網格棋盤,
棋盤的左下角有一匹馬,請你計算至少需要幾步可以將它移動到棋盤的右上角,若無法走到,則輸出-1.
如n=1,m=2,則至少需要1步;若n=1,m=3,則輸出-1

主要用深度優先搜尋演算法去做

n +=1
m +=1
visit = [([False]*n) for i in range(m)]
step  = ((2,1),(1,2),(-1,2),(-2,1),(-2,-1),(-1,-2),(1,-2),(2,-1))
flag  = False
cnt = 0 
minCnt = n*m
def dfs(row,col):
    global minCnt
    global cnt
    global flag
    global step
    global visit
    if row == m-1 and col == n-1:
        flag = True
        if minCnt > cnt:
            minCnt = cnt
        return
    for item in step:
        newRow,newCol= row+item[0],col+item[1]
        if newRow>=0 and newRow<m and newCol>=0 and newCol < n:
            if visit[newRow][newCol] == False:
                visit[newRow][newCol] =True
                cnt +=1
                dfs(newRow,newCol)
                cnt -=1
                visit[newRow][newCol] =False
visit[0][0] =True
dfs(0,0)           
print (minCnt if flag else -1)

題目id:25  格式化時間

給你一個時間t(t是一個字典,共有六個字串key(year,month,day,hour,minute,second),值為每個值為數字組成的字串,
如t={'year':'2013','month':'9','day':'30','hour':'16','minute':'45','second':'2'}
請將其按照以下格式輸出, 格式:XXXX-XX-XX XX:XX:XX。如上例應該輸出: 2013-09-30 16:45:02。

d =[t['year'].zfill(4),t['month'].zfill(2),t['day'].zfill(2),t['hour'].zfill(2),t['minute'].zfill(2),t['second'].zfill(2)]
print '-'.join(d[:3]),':'.join(d[3:])

題目id:26  序列判斷

給你一個整陣列成的列表L,按照下列條件輸出:
若L是升序排列的,則輸出"UP";
若L是降序排列的,則輸出"DOWN";
若L無序,則輸出"WRONG"。

if L == sorted(L):
    print 'UP'
elif L == sorted(L,reverse=True):
    print 'DOWN'
else:
    print 'WRONG'

題目id:27  加油站

每個加油站加油都有一個上限,儲存在列表limit中,即limit[i]為第i個加油站加油的上限,
而從第i個加油站開車開到第(i+1)%n個加油站需要cost[i]升油,cost為一個列表。
現在有一輛開始時沒有油的車,要從一個加油站出發繞這個公路跑一圈回到起點。
給你整數n,列表limit和列表cost,你來判斷能否完成任務。
如果能夠完成任務,輸出起始的加油站編號,如果有多個,輸出編號最小的。
如果不能完成任務,輸出-1。

for i in range(n):
    sumLimit,sumCost = 0,0
    for k in range(n):
        sumLimit +=limit[(k+i)%n]
        sumCost += cost[(k+i)%n]
        if sumCost > sumLimit:
            break
    else:
        print i
        break
else:
    print -1

題目id:28  相同數字

給你一個整數列表L,判斷L中是否存在相同的數字,
若存在,輸出YES,否則輸出NO。

print ('NO' if len(set(L)) == len(L) else 'YES')

題目id:29  判斷三角形

給你三個整數a,b,c, 判斷能否以它們為三個邊長構成三角形。
若能,輸出YES,否則輸出NO。

d=[a,b,c]
d.sort()
if d[0]+d[1]>d[2] and abs(d[0]-d[1])<d[2]:
    print 'YES'
else:
    print 'NO'

題目id:30  National Day

馬上國慶節了,用一個英文單詞描述你此時此刻的心情。

print 'Happy'

題目id:31  山峰的個數

十一假期,小P出去爬山,爬山的過程中每隔10米他都會記錄當前點的海拔高度(以一個浮點數表示),
這些值序列儲存在一個由浮點陣列成的列表h中。回到家中,小P想研究一下自己經過了幾個山峰,請你幫他計算一下,輸出結果。
例如:h=[0.9,1.2,1.22,1.1,1.6,0.99], 將這些高度順序連線,會發現有兩個山峰,故輸出一個2(序列兩端不算山峰)

cnt = 0
for i in xrange(1,len(h)-1):
    if h[i]>h[i-1] and h[i]>h[i+1]:
        cnt += 1
print cnt

題目id:32  三角形形狀

給以一個三角形的三邊長a,b和c(邊長是浮點數),請你判斷三角形的形狀。
若是銳角三角形,輸出R,
若是直角三角形,輸出Z,
若是鈍角三角形,輸出D,
若三邊長不能構成三角形,輸出W.

d=[a,b,c]
d.sort()
if d[0]+d[1] > d[2] and abs(d[0]-d[1]) < d[2]:
    if d[0]**2+d[1]**2 == d[2]**2:
        print 'Z'
    elif d[0]**2+d[1]**2 >d[2]**2:
        print 'R'
    else:
        print 'D'
else:
    print 'W'

題目id:33  大冪次運算

給你兩個正整數a(0 < a < 100000)和n(0 <= n <=100000000000),計算(a^n) % 20132013並輸出結果

print pow(a,n,20132013)

題目id:34  密碼生成

生活在當代社會,我們要記住很多密碼,銀行卡,qq,人人,微博,郵箱等等。小P經過一番思索之後,發明了下面這種生成密碼方法:
給定兩個正整數a和b, 利用a / b我們會到的一個長度無限的小數(若a / b不是無限小數,
比如1/2=0.5,我們認為0.5是0.5000000...,同樣將其看做無限長的小數),小P將該小數點後第x位到第y位的數字
當做密碼,這樣,無論密碼有多長,小P只要記住a,b,x,y四個數字就可以了,牢記密碼再也不是那麼困難的事情了。
現在告訴你a,b,x,y(0 < a,b <= 20132013, 0 < x <= y < 100000000000),請你輸出密碼。
例如:a = 1, b = 2, x = 1, y = 4, 則 a / b = 0.5000000..., 輸出小數點後第1到4位數字,即5000

decimals = []
if a > b :
a =a%b
cnt = 0
flag = False
x-=1
y-=1
while cnt <= y:
    decimalPart,a = divmod(a*10**1024,b)
    if flag:
        decimals.append(str(decimalPart).zfill(1024))
    if x >= cnt and x < cnt+1024:
        flag = True
        decimals.append((str(decimalPart).zfill(1024))[x-cnt:])
    if y>=cnt and y< cnt+1024:
        break
    cnt +=1024
if y/1024 !=x/1024:
    decimals[-1]=(str(decimals[-1]))[:y-cnt+1]
else:
    decimals[-1]=(str(decimals[-1]))[:y-x+1]
print ''.join(decimals)

題目id:35  最大連續子序列

給你一個整數list L, 如 L=[2,-3,3,50], 求L的一個連續子序列,使其和最大,輸出最大子序列的和。
例如,對於L=[2,-3,3,50], 輸出53(分析:很明顯,該列表最大連續子序列為[3,50]).

def maxSubSum(L):
    maxSum,thisSum= 0,0
    for item in L:
        thisSum += item;
        if thisSum > maxSum:
            maxSum = thisSum
        elif thisSum < 0:
            thisSum = 0
    return maxSum

print maxSubSum(L)

題目id:36  最大非連續子序列

給你一個整數list L, 如 L=[2,-3,3,50], 求L的一個非連續子序列,使其和最大,輸出最大子序列的和。
這裡非連續子序列的定義是,子序列中任意相鄰的兩個數在原序列裡都不相鄰。
例如,對於L=[2,-3,3,50], 輸出52(分析:很明顯,該列表最大非連續子序列為[2,50]).

注意類似這種情況L=[-1,-1,-1,-1,-1,0]

if len(L) >= 2:
    dp=[L[0],max(L[0],L[1])]
    for i in range(2,len(L)):
        dp.append(max(dp[i-1],max(L[i]+dp[i-2],L[i])))
    print dp[len(L)-1]
else:
    print L[0]

題目id:37  簡單題之勾股定理

 給你直角三角形的兩個直角邊的邊長a,b,請你求出其斜邊邊長,結果保留小數點後三位小數。

如a=3, b =4, 則輸出5.000。

import math
print "%.3f"%math.sqrt(a**2+b**2)

題目id:38  簡單題之列表轉換

給你一個字串列表L,請用一行程式碼將列表所有元素拼接成一個字串並輸出。
如L=['abc','d','efg'], 則輸出abcdefg。

print ''.join(L)

題目id:39  簡單題之輸出格式練習

 給你一個字串列表L,用一行程式碼順序輸出L中的元素,元素之間以一個空格隔開,注意行尾不要有空格,輸出單獨佔一行。

如L=['abc','d','efg'], 則輸出abc d efg。

print ' '.join(L)

 題目id:40  整數解

 給你兩個整數a和b(-10000<a,b<10000),請你判斷是否存在兩個整數,他們的和為a,乘積為b。

若存在,輸出Yes,否則輸出No
例如:a=9,b=15, 此時不存在兩個整數滿足上述條件,所以應該輸出No。

import math
x1 = int(float(a+math.sqrt(a**2-4*b))/2)
x2 = int(float(a-math.sqrt(a**2-4*b))/2)
if x1+x2 == a and x1*x2 == b:
    print 'Yes'
else:
    print 'No'

題目id:41  Py數

 Py從小喜歡奇特的東西,而且天生對數字特別敏感,一次偶然的機會,他發現了一個有趣的四位數2992,

這個數,它的十進位制數表示,其四位數字之和為2+9+9+2=22,它的十六進位制數BB0,其四位數字之和也為22,
同時它的十二進位制數表示1894,其四位數字之和也為22,啊哈,真是巧啊。
Py非常喜歡這種四位數,由於他的發現,所以這裡我們命名其為Py數。
現在給你一個十進位制4位數n,你來判斷n是不是Py數,若是,則輸出Yes,否則輸出No。
如n=2992,則輸出Yes; n = 9999,則輸出No。

def getSumByValue(n,value):
    res = 0
    while n:
        res += n%value
        n /=value
    return res

if getSumByValue(n,10) == getSumByValue(n,16) == getSumByValue(n,12):
    print 'Yes'
else:
    print 'No'

題目id:42  分拆素數和

把一個偶數拆成兩個不同素數的和,有幾種拆法呢?
現在來考慮考慮這個問題,給你一個不超過10000的正的偶數n,
計算將該數拆成兩個不同的素數之和的方法數,並輸出。
如n=10,可以拆成3+7,只有這一種方法,因此輸出1.

import math
def is_prime(num):
    for i in range(2,int(math.sqrt(num)+1)):
        if num%i == 0:
            return False
    return True

cnt = 0
for i in range(2,n/2):                           #注意1不是素數
    if is_prime(i) and is_prime(n-i):
        cnt +=1
print cnt

題目id:43  斐波那契數列

斐波那契數列為1,1,2,3,5,8...。數列從第三項起滿足,該項的數是其前面兩個數之和。
現在給你一個正整數n(n < 10000), 請你求出第n個斐波那契數取模20132013的值(斐波那契數列的編號從1開始)。

a,b=1,1
for i in range(3,n+1):
    a,b=b%20132013,(a+b)%20132013
print b

題目id:44  超級樓梯

有一樓梯共n級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第n級,共有多少種走法?
現在給你一個正整數n(0<n<40),請你輸出不同的走法數。
如n=2,則輸出1(你只有一種走法,走一步,從第一級到第二級)

a,b=1,1
for i in range(3,n+1):
    a,b=b,(a+b)
print b

題目id:45  砝碼問題

有一組砝碼,重量互不相等,分別為m1、m2、m3……mn;它們可取的最大數量分別為x1、x2、x3……xn。
現要用這些砝碼去稱物體的重量,問能稱出多少種不同的重量。
現在給你兩個正整數列表w和n, 列表w中的第i個元素w[i]表示第i個砝碼的重量,列表n的第
i個元素n[i]表示砝碼i的最大數量。i從0開始,請你輸出不同重量的種數。
如:w=[1,2], n=[2,1], 則輸出5(分析:共有五種重量:0,1,2,3,4)

母函式的問題

m = set()
for i in range(n[0]+1):
    m.add(w[0]*i)
for i in range(1,len(n)):
    tmp = m.copy()
    m.clear()
    for j in range(n[i]+1):
        for k in tmp:
            m.add(w[i]*j+k)
print len(m)

題目id:45  測試貢獻題目

給你一個list L, 如 L=[2,8,3,50], 對L進行降序排序並輸出, 如樣例L的結果為[50,8,3,2]

print sorted(L,reverse = True)

題目id:46  取石子游戲

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,
一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。
現在給出初始的兩堆石子的數目a和b,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。
如果你是勝者,輸出Win,否則輸出Loose。
例如,a=3,b=1, 則輸出Win(你先在a中取一個,此時a=2,b=1,此時無論對方怎麼取,你都能將所有石子都拿走).

博弈論問題
import math
p = (math.sqrt(float(5))+1)/float(2)
c = abs(a-b)
if a > b:
    a = b
if a == int(p*c):
    print "Loose"
else: print "Win"

題目id:47  楊輝三角

還記得中學時候學過的楊輝三角嗎?具體的定義這裡不再描述,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
..............
先在給你一個正整數n,請你輸出楊輝三角的前n層
注意:層數從1開始計數,每層數字之間用一個空格隔開,行尾不要有空格。
如n=2,則輸出:
1
1 1
trangle = [['1'],['1','1']]

def print_trangle(n):
    for i in range(n):
        print ' '.join(trangle[i])   
for i in range(3,n+1):
    tmp=['1']
    newRow= trangle[i-2]
    for j in range(len(newRow)-1):
        tmp.append(str(int(newRow[j])+int(newRow[j+1])))
    tmp.append('1')
    trangle.append(tmp)
    
print_trangle(n)

題目id:48  砝碼問題II

有一組砝碼,重量互不相等,分別為m1、m2、m3……mn;每種砝碼的數量有無限個。 
現要用這些砝碼去稱物體的重量,給你一個重量n,請你判斷有給定的砝碼能否稱出重量n。 
現在給你一個正整數列表w和一個正整數n,列表w中的第i個元素w[i]表示第i種砝碼的重量,
n表示要你判斷的重量。如果給定砝碼能稱出重量n,輸出Yes,否則輸出No。
例如,w=[2,5,11], n=9,則輸出Yes(取兩個2,一個5)。

  此類問題用母函式做比較簡單

def solve(): 
    num=[]
    for i in range(len(w)):
        num.append(n/w[i])
        m = set()
        for i in range(num[0]+1):
            m.add(w[0]*i)
    for i in range(1,len(num)):
        tmp = m.copy()
        m.clear()
        for j in range(num[i]+1):
            for k in tmp:
                if w[i]*j+k < n:
                    m.add(w[i]*j+k)
                elif w[i]*j+k == n:
                    return "Yes"
    return "No"

print solve()

題目id:49  進位制轉換

給你一個十進位制數a,將它轉換成b進位制數,如果b>10,用大寫字母表示(10用A表示,等等)
a為32位整數,2 <= b <= 16
如a=3,b = 2, 則輸出11

不要忘記a為負數的情況
base = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
def transfer(a,b):
    res = []
    aa = abs(a)
    while aa:
        res.append(base[aa%b])
        aa/=b
    if a<0:
        res.append('-')        
    return ''.join(res[::-1])
print transfer(a,b)

 題目id:50  Py扔鉛球

Py不但是程式設計大牛,而且是運動健將。比如說扔鉛球,1000m,現在Py參加校園扔鉛球比賽,
給你Py的身高a(雙精度數),球落地點與Py頭部的連線與水平線的夾角 b(弧度),
要你編寫一個程式計算Py扔鉛球的水平距離。
a,b都是浮點數,注意b是弧度,其中, 140 < a < 200,  0 < b < 1.5.
輸出你求出的水平距離,保留到小數點後三位。
如,a = 165.5, b=1.1, 則輸出84.234
import math
print "%.3f" % (a/math.tan(b))

 題目id:53  神の安♂排

記得有一次全班去唱K, 其中有個活動是情歌對唱. 具體操作流程是這樣的:
準備好 21 個鬮(我們班 15 男 6 女), 其中只有兩個是有標記的, 每人隨意抓取一個, 最後取到有標記的鬮的兩個人去點首情歌對唱.
旁邊一哥們兒幽幽地對我說, 看來攪基真是神的安排啊, 你看我們班的男女人數, 攪基的機率 C(15,2)/C(21,2) 剛好是 1/2.
給跪了, 這哥們兒對數字太敏感了, 簡直是拉馬努金轉世啊. 不過我隨之想到一個問題: (21, 15) 真的是神的唯一安排嗎? 其實不是的,
神還有很多類似的安排. 比如 (4, 3), 顯然 C(4,2)/C(3,2) 也等於 1/2, 當然還有 (120, 85) 等等等等.
神的安排太多太多了, 如果我們定義 (n, m) 是一個安排(其中 1 < m < n), 而如果 C(m,2)/C(n,2) = 1/2, 它就是神的安排.
現在的問題是, 給你一個不大於 10^9 的正整數 N, 有多少組神的安排 (n, m) 滿足 n <= N 呢?

具體參考 關於求解不定方程的n(n-1)=2m(m-1)的解法的總結
cnt = 0
x,y=1,1
while x<= 2*N-1:
    x,y=3*x+4*y,2*x+3*y
    if x > 2*N-1:
        break
    if x%2 and y%2:
        cnt +=1
print cnt

題目id:57  那些年我們集過的卡片

不知道大家的童年有沒有過和我相似的經歷。我記得小時候經常買乾脆面,不為別的,只是因為裡面有一張人物卡片。
其實有很多這樣的活動都有一個相同的模式:N 種人物卡片,每次買一包乾脆面隨機得到一張。當你集齊這 N 種人物時,就會有相應的獎勵。
那時候還不懂怎麼計算概率,白白給人家送了好多錢,吃了好多幹脆面。
現在的任務是,給你一個正整數 N (1 <= N <= 10^4),請你幫我從期望的角度計算平均需要買多少包乾脆面才能集齊這 N 種人物。
提醒:由於結果可能不是整數,所以結果只保留到小數點後兩位。
ans = 0
for i in range(N,0,-1):
        ans+=N*1.0/i
print "%.2f" % ans

 

 

 

 

 

 

 

 

 

相關文章