這一章開始看書了,在寫題之前加了知識點回憶的部分。
學到回憶的內容包括:
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...