演算法其實很好玩

2021-08-17 05:11:31 字數 4643 閱讀 1585

先有工程問題需要解決,演算法是解法,設計演算法就是尋求解法。雖然演算法作為一門科學是歸納尋求解法的思路,但學習這種歸納法的前提是能體會各種具體演算法的用處和效果。

——王益(摘自《演算法的樂趣》序一)

全文按照先易後難順序進行排版。

可能會有很多人對這種方法不屑一顧,但是就能夠很好的解決問題這一點來說,能抓到老鼠的都是好貓。

1. 利用已知條件篩選

題目描述

美國數學家維納(n.wiener)智力早熟,11歲就上了大學。

他曾在1935~2023年應邀來中國清華大學講學。

一次,他參加某個重要會議,年輕的臉孔引人注目。

於是有人詢問他的年齡,他回答說:

「我年齡的立方是個4位數。我年齡的4次方是個6位數。這10個數字正好包含了從0到9這10個數字,每個都恰好出現1次。」

請你推算一下,他當時到底有多年輕。

題目描述

我們要求找出具有下列性質數的個數(包含輸入的自然數n):

先輸入乙個自然數n(n<=1000),然後對此自然數按照如下方法進行處理:

在它的左邊加上乙個自然數,但該自然數不能超過原數的一半;

加上數後,繼續按此規則進行處理,直到不能再加自然數為止.

輸入輸出格式

輸入格式:

乙個自然數n(n<=1000)

輸出格式:

乙個整數,表示具有該性質數的個數。

輸入輸出樣例

輸入樣例#1:6

輸出樣例#1:6

說明滿足條件的數為6,16,26,126,36,136

2. 列舉

題目描述

古羅馬帝國開創了輝煌的人類文明,但他們的數字表示法的確有些繁瑣,尤其在表示大數的時候,現在看起來簡直不能忍受,所以在現代很少使用了。

之所以這樣,不是因為發明表示法的人的智力的問題,而是因為乙個宗教的原因,當時的宗教禁止在數字中出現0的概念!

羅馬數字的表示主要依賴以下幾個基本符號:

i --> 1

v --> 5

x --> 10

l --> 50

c --> 100

d --> 500

m --> 1000

這裡,我們只介紹一下1000以內的數字的表示法。

單個符號重複多少次,就表示多少倍。最多重複3次。

比如:ccc表示300 xx表示20,但150並不用lll表示,這個規則僅適用於i x c m。

如果相鄰級別的大單位在右,小單位在左,表示大單位中扣除小單位。

比如:ix表示9 iv表示4 xl表示40

49 = xlix

更多的示例參見下表,你找到規律了嗎?

i = 1

ii = 2

iii = 3

iv = 4

v = 5

vi = 6

vii = 7

viii = 8

ix = 9

x = 10

xi = 11

xii = 12

xiii = 13

xiv = 14

xv = 15

xvi = 16

xvii = 17

xviii = 18

xix = 19

xx = 20

xxi = 21

xxii = 22

xxix = 29

*** = 30

***iv = 34

***v = 35

***ix = 39

xl = 40

l = 50

li = 51

lv = 55

lx = 60

lxv = 65

l*** = 80

xc = 90

xciii = 93

xcv = 95

xcviii = 98

xcix = 99

c = 100

cc = 200

ccc = 300

cd = 400

d = 500

dc = 600

dcc = 700

dccc = 800

cm = 900

cmxcix = 999

本題目的要求是:請編寫程式,由使用者輸入若干個羅馬數字串,程式輸出對應的十進位制表示。

輸入格式是:第一行是整數n,表示接下來有n個羅馬數字(n<100)。

以後每行乙個羅馬數字。羅馬數字大小不超過999。

要求程式輸出n行,就是羅馬數字對應的十進位制資料。

例如,使用者輸入:

3l***

xciii

dccii

則程式應該輸出:

8093

702

題目描述

小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分。

三階幻方指的是將1~9不重複的填入乙個3

*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。

三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:

「二四為肩,六八為足,左三右七,戴九履一,五居其中」,

通過這樣的一句口訣就能夠非常完美的構造出乙個九宮格來。 49

2357

816有意思的是,所有的三階幻方,都可以通過這樣乙個九宮格進行若干映象和旋轉操作之後得到。

現在小明準備將乙個三階幻方(不一定是上圖中的那個)中的一些數抹掉,交給鄰居家的小朋友來進行還原,並且希望她能夠判斷出究竟是不是只有乙個解。

而你呢,也被小明交付了同樣的任務,但是不同的是,你需要寫乙個程式~

輸入格式:

輸入僅包含單組測試資料。

每組測試資料為乙個3

*3的矩陣,其中為0的部分表示被小明抹去的部分。

對於100

%的資料,滿足給出的矩陣至少能還原出一組可行的三階幻方。

輸出格式:

如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出「too many」(不包含引號)。

樣例輸入07

2050

030樣例輸出67

2159

834

魔方可以對它的6個面自由旋轉。

我們來操作乙個2階魔方(如圖1所示):

為了描述方便,我們為它建立了座標系。

各個面的初始狀態如下:

x軸正向:綠

x軸反向:藍

y軸正向:紅

y軸反向:橙

z軸正向:白

z軸反向:黃

假設我們規定,只能對該魔方進行3種操作。分別標記為:

x 表示在x軸正向做順時針旋轉

y 表示在y軸正向做順時針旋轉

z 表示在z軸正向做順時針旋轉

xyz 則表示順序執行x,y,z 3個操作

題目的要求是:

使用者從鍵盤輸入乙個串,表示操作序列。

程式輸出:距離我們最近的那個小方塊的3個面的顏色。

順序是:x面,y面,z面。

例如:在初始狀態,應該輸出:

綠紅白初始狀態下,如果使用者輸入:

x則應該輸出:

綠白橙初始狀態下,如果使用者輸入:

zyx則應該輸出:

紅白綠

題目描述

當你輸入信用卡號碼的時候,有沒有擔心輸錯了而造成損失呢?其實可以不必這麼擔心,因為並不是乙個隨便的信用卡號碼都是合法的,它必須通過luhn演算法來驗證通過。

該校驗的過程:

1、從卡號最後一位數字開始,逆向將奇數字(1、3、5等等)相加。

2、從卡號最後一位數字開始,逆向將偶數字數字,先乘以2(如果乘積為兩位數,則將其減去9),再求和。

3、將奇數字總和加上偶數字總和,結果應該可以被10整除。

例如,卡號是:5432123456788881

則,奇數字和=35

偶數字乘以2(有些要減去9)的結果:1 6 2 6 1 5 7 7,求和=35。

最後35+35=70 可以被10整除,認定校驗通過。

請編寫乙個程式,從鍵盤輸入卡號,然後判斷是否校驗通過。通過顯示:「成功」,否則顯示「失敗」。

比如,使用者輸入:356827027232780

程式輸出:成功

【參考測試用例】

356406010024817 成功

358973017867744 成功

356827027232781 失敗

306406010024817 失敗

358973017867754 失敗

可能會有很多人對這種方法不屑一顧,但是就能夠很好的解決問題這一點來說,能抓到老鼠的都是好貓。

1. 全排列

題目描述
解題思路:

2. 派遣使者問題

題目描述
解題思路:

結合條件進行設計。

3.串的翻轉

題目描述
解題思路:

結合條件進行設計。

4.平面上直線最大交點問題

題目描述
解題思路:

結合條件進行設計。

產品這麼賣很好玩

最近和朋友聊天,在軟體行業,其實銷售策略更加有意思,牽扯的事情也比較有趣.1 最近xbox360上市了,很便宜,據說microsoft賣一台就賠100多美金.2 擋不住的趨勢 中,張明正提出乙個策略是 保齡球法則 就是主攻主要客戶,然後通過主要客戶的連帶作用,將相關使用者的市場開啟,就像保齡球一樣,...

silverlight旋轉中心很好玩

我要說的是關於乙個物件繞乙個指定的點旋轉的問題,通常silverlight在blend下新建的旋轉都有個旋轉中心,如果要實現乙個矩形繞它自己的乙個角旋轉的話 如圖 將此例中的登入框繞左上角的那個圓形旋轉,做法如下 第一貞動畫狀態裡設定矩形登入框的旋轉中心點位置與圓形的旋轉中心點的位置重合如下圖 最後...

ubuntu 安裝 pygame 很好玩的東西

1.簡介 sudo apt get install python pygame 其餘原始碼和其他平台的安裝包如rpm可以訪問 找到。如果python沒有安裝開發庫,也會導致pygame不能安裝,比如找不到python.h 等檔案 sudo apt get install python2.6 dev ...