PythonTip--8.4

計算機小白發表於2017-08-04

整數解

題目描述:
給你兩個整數a和b(-10000 < a,b<10000),請你判斷是否存在兩個整數,他們的和為a,乘積為b。
若存在,輸出Yes
不存在,則輸出No

思路:
最最笨的方法應該就是直接迴圈了。。。
講稍微優化一點的:
因為知道的一個是和,一個是積,又是求兩個解,這樣就可以想到初中學過的一元二次方程。ax^2 +b*X+c=0
= -b/a
= c/a

為了 更簡單一點,方程設為 x^2-a*x+b=0
這樣: = a
= b
所以delta= a^2-4*b
因為題目要求是兩個整數解,所以要判斷delta是否小於0,
兩個解分別為

x = (b+delta^0.5)/2
y= (b-delta^0.5)/2

因為還要是整數,所以再判斷一下

(b+delta^0.5)%2 == 0
(b-delta^0.5)%2 == 0

這樣就差不多了,下面貼程式碼:
程式碼

import math
def func2(a,b):
    delta = a**2-4*b
    if delta <0:
        return "No"
    x1 = (a+math.sqrt(delta))/2
    x1_1 = (a+math.sqrt(delta))%2
    x2 = (a-math.sqrt(delta))/2
    x2_1 = (a-math.sqrt(delta))%2
    if  x1_1==0 and x2_1 ==0:
        return 'Yes'
    else:return 'No'
print(func2(a,b))

=============分割線==========

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。

思路:
這題就把每個進位制的數加起來比較一下吧,沒什麼繞的。。。

程式碼

n=2991

def func(n):
    int_sum = 0
    int_num = n
    while int_num :
        int_sum +=  (int_num % 10)
        int_num //= 10
    hex_num = n
    hex_sum = 0
    while hex_num:
        hex_sum += (hex_num%16)
        hex_num //=16
    twe_num = n
    twe_sum = 0
    while twe_num:
        twe_sum += (twe_num%12)
        twe_num//=12
    if int_sum == hex_sum == twe_sum:
        return 'Yes'
    return 'No'

print(func(n))

=============分割線=============

分差素數和

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

思路:
先定義一個函式,判斷是否是素數,然後一個個迴圈判斷吧。

程式碼

n = 10

def isPrime(n):
    for i in range(2,n//2+1):
        if n%i == 0:
            return False
    return True

def func(n):
    count = 0
    for i in range(2,n//2+1):
        if isPrime(i) and isPrime(n-i) and i!= n-i:
            count+=1
    return count
print(func(n))