重走長征路 《演算法競賽入門經典》第2章 習題筆記

2021-08-09 16:26:26 字數 2084 閱讀 3768

這一章開始看書了,在寫題之前加了知識點回憶的部分。

學到回憶的內容包括:

for:簡單直接

while:適合每次的變化量不同(不是「遞增」式迴圈)& 方便每次初始化變數 迴圈的次數不確定

do..while:迴圈終止判斷在計算之後

算術運算溢位&程式效率低下

輸出中間結果

計時函式

time.h

clock() / clocks_per_sec不要直接使用clock()的返回值!

管道技巧

windows命令列下輸入echo 20|abc,作業系統會自動輸入20,abc為程式名

方便簡潔,但是不能同時讀寫檔案和標準輸入輸出,比賽中容易成為不能通過的原因

比較好的解決方式是定義local,使得只能在本機生效,提交時注釋掉define語句即可。

更好的方法是在編譯選項而不是程式裡定義。

#define

...#ifdef

freopen("test.in", "r", stdin);

freopen("test.out", "w", stdout);

#endif

...

file *fin, *fout;

fin = fopen("test.in", "rb");

fout = fopen("test.out", "wb");

...while(fscanf(fin, "%d", &n) == 1 && n)

...fprintf(fout, "%.3lf", (double)s / n);

fclose("testin");

fclose("testout");

乙個有點冗長的方法……沒記住還翻了書。

優點是靈活性大,比如可以反覆開啟和讀寫。

注意事項:

需要先宣告變數fin, fout,型別是file*.

採用fscanf, fprintf, 第乙個引數分別為fin和fout(很不光榮地給忘了)。

另外,這段裡面需要注意的地方還有昨天產生問題的輸出小數——應該是(double)variable.

floor()函式返回比該數小的最大整數

四捨五入:floor(n + 0.5); //不能解決0.5小數,待討論

自己感覺解決方法應該是加個if語句在前面單獨把0.5拎出來。

題目描述:輸入三個數a b c 輸出結果為a/b c為保留幾位小數 c≤100。

看了別人的解法:

輸出結果應該分為3部分 第一部分是整數部分 第二部分是個小數點 第三部分就要用迴圈語句輸出小數部分 第三部分:先將k=a*10

用k/b得乙個數 這個數的個數為就為a/b小數點後第一位 k=a*100 用k/b得乙個數 這個數的個數為就為a/b小數點後第二位…

在用if語句判斷 第c位如果≤4 則輸出第c位本身 大於5就將第c位+1(四捨五入)

然而,即使是看了解法,對比自己的和別人的**,總覺得自己缺點魂……

繞開了實際的計算方法,而採用了不知道怎麼亂想出來的方法。

程式畢竟是拿來解決實際問題的啊。

另乙個超讚的實現,用了新的輸出方式:

#define _crt_secure_no_warnings

#include

#include

int main()

return

0;}

仍然是參考了別人的**。

一次性求個十百位的方式

#include

#include

void count(int i, int

*add, int

*mul)

int main()

system("pause");

return

0;}

感覺自己簡直zz,用了a = i / 100…

卡住好久。

參考:

演算法競賽入門經典(第2版)例題(第3章)

例題 3 1 tex中的引號 tex quotes include intmain else printf c c return0 例題 3 2 wertyu include char s 1234567890 qwertyuiop asdfghjkl zxcvbnm,int main 例題 3 3...

演算法競賽入門經典 第2版 習題2 3詳解

畫圖分析 第二個迴圈 列印 for k 1 k 2 n i 1 k printf n 換行 return 0 執行結果 上面寫的是列印倒三角形的 到這裡我覺得還是有必要寫乙個列印正三角形的 列印 for k 1 k 2 i 1 k printf n 換行 return 0 執行結果 綜上所述 其實這...

演算法競賽入門經典 習題2答案

輸入乙個不超過10 9的正整數,輸出他的位數,例如12735的位數是5.請不要使用任何數學函式,只用四則運算和迴圈語句實現 include include define uint unsigned int using namespace std int main cout i endl return...