突然發現,有道難題也有程式設計比賽,先看了一下去年的題目,自己寫了乙個方法,再與官方給出的方法相比較,下面我對我的方法和官方方法作一下比較,找出不足,進步進步
problem statement:
如果乙個數字十進位制表達時,不存在連續兩位數字相等,則稱之為「不重複數」。例如,105,1234和12121都是「不重複數」,而11,100和1225不算。給定乙個long型別數字a,返回大於a的最小「不重複數」。
definition:
class: unrepeatingnumbers
method: next
parameters: long
returns: long
method signature: long next(long a)
(be sure your method is public)
constraints:
a 取值範圍是[0, 10^17],注意是閉區間。
examples:
0) 54
returns: 56
大於54的最小數字是55,但55不是「不重複數」。下乙個數字是56,它滿足條件。
1) 10
returns: 12
2) 9
returns: 10
3) 98
returns: 101
99和100都不是「不重複數」, 101是。
4) 21099
returns: 21201
這道題目其實不難,可是程式設計比賽,高手如雲,一道簡單的題目,厲害的人可以寫出效率極高的**。。這就是競爭啊。。。所以我們平時程式設計也不能只求完成,還要求效率。效率效率!
另外,為了比較執行時間,在這裡我用了函式clock,以計算程式執行時間。
#include
#include
long next(long n)//我的方法
n/=i; }
return m; }
long getnext( long a)
//官方的方法
d = nd;
//表明d和nd都增大10倍 }
}while (! done);
return a; }
int main()
但是,執行結果耗時都是0.000000,這就是clock的侷限性了吧,它只能精確到15ms,而程式執行用的時間更短,或許是這道題比較簡單的緣故吧。不過,在這裡可以學到這個函式的使用方法,方便將來的應用。
其實,這兩種方法大同小異吧:
相同點:
主要是對輸入值進行處理,不斷除10取整,比較,直到比較到最高位為止;
不同點:
我的方法:另外宣告乙個long,對原來的值進行儲存,而原來的值,則不斷的進行除10取整;
官方的方法:宣告了乙個bool變數,用來判斷是否進行到了最高位;而原來的值,則不斷的移位比較而已,通過除10,100,1000...依次比較下去,而bool就用來控制除數的盡頭。
總的來說呢,這兩種方法的區別就是,一是改變原值,但要注意對原值的儲存;二是改變除數,但要注意對除數界限的控制。
論有道難題
資料結構的書中有這樣的描述,程式 演算法 資料結構。我不同意這樣的觀點。這樣的觀點也不知誤導了多少的初學者。軟體開發再不斷的發展,這樣的論調早已過時,但還在程式設計界不斷的相傳。不知是書本的悲哀還是 高手 的悲哀。我們不斷的強調演算法的對程式的重要性,通過對演算法的熟練度來看乙個人程式設計水平的高低...
菜鳥也做有道難題
重在參與 嘿嘿。思路和我的掃雷程式一樣,找到周圍的所有的蘿蔔總數是否在ab之間,這裡我沒有考慮ab的大小關係。每塊地由格仔 cell 組成,每個格仔 cell 有三個屬性 地標 x,y 和蘿蔔數 count 邏輯很簡單,遍歷地 field 裡所有的格仔 list 找到當前格仔 currentcell...
2010有道難題練習賽
1 時間限制 1000ms 記憶體限制 65536kb 描述 計算a加b。輸入一行,用空格分開的兩個整數a和b。其中0 a,b 10000。輸出乙個整數,為a加b的和。樣例輸入 1 2 樣例輸出 3 include void main 2時間限制 1000ms 記憶體限制 65536kb 描述 計算...