例題2.1 aabb(輸出所有的形如aabb的4位完全平方數)
演算法一:對1000到9999分別進行aabb以及完全平方的判斷,但很明顯效率較低。
#include #include int main()
printf("\n");
return 0;
}
演算法二:進行雙層迴圈,分別對a進行1到9和對b進行0到9的遍歷,再對得到的形如aabb的四位數做完全平方的判斷。注意四捨五入floor(sqrt(double(n)) + 0.5),如floor(x + 0.5)等於1的區間為[0.5, 1.5)。
#include #include int main()
} printf("\n");
return 0;
}
演算法三:列舉平方根,從而避免開平方操作,square從1開始,當其平方數小於1000時開始下層迴圈,大於9999時跳出迴圈,迴圈體內進行aabb的判斷。
#include #include int main()
printf("\n");
return 0;
}
例題2.2 3n + 1問題(任何大於1的數n,若為奇數,變為3n + 1,若為偶數變為n/2,經過若干這樣的變換後,最終變為1,求變換次數,其中n <= 10^9)
演算法分析:若用int n來存放輸入的數,當輸入的n = 987654321時,對於n = 3n + 1;將導致n溢位int型範圍值(-2147483648~2147483647),使得n值為負值,不滿足n >1,故需要用long long型(-2^63~2^63-1)存放已輸入的n值。
由於不知道迴圈次數,本題需要用到while迴圈,當while(n > 1)不滿足時跳出迴圈。
#include int main()
printf("%d\n", count);
return 0;
}
例題2.3 近似計算(計算π/4 = 1 - 1/3 + 1/5 - 1/7 +......,直到最後一項小於10^-6)
演算法分析:由於最後一項需要計算在內,故用do-while迴圈。
#include int main()
while(temp >= 1e-6); //注意10^-6的寫法
printf("%.6f\n", pi);
return 0;
}
例題2.4 階乘之和的末6位(計算s = 1! + 2! + 3! + ......n!,其中n<=10^6)
演算法分析:當計算第n項n!時,若n比較大,會超過int的範圍。需要用到一點數學知識:要計算只包含加法,減法和乘法的整數表示式除以正整數n的餘數,可以在每步計算之後對n取餘,結果不變。
#include #include int main()
s = (s + factorial) % mod; //沒進行一次乘法或者加法,都要對mod取餘,使結果盡可能小
} printf("%d\n", s);
printf("time used = %.6f\n", (double)clock() / clocks_per_sec - t1); //使用clock()和clocks_per_sec來計算時間差(秒)
return 0;
}
可以將n設定160,1600,6400……來進行多組測試,可知程式的執行時間大致與n的平方成正比。從40開始,答案始終不變,這是因為25!的末尾後面有6個0,故可修改原程式,在輸入n後,加一條語句if(n > 25) n = 25;
例題2.5 資料統計(輸入一些整數,求出它們的最小值,最大值和平均值)
演算法一:設定乙個inf和-inf,每輸入乙個x,就對其進行比較,然後累加。
#include #include int main()
printf("%d %d %f\n", min, max, s/count);
return 0;
}
scanf遇到回車鍵時將資料從緩衝區送到程式,例如輸入5, 8, 9, 14, 16,按回車鍵,再按crtl + z鍵結束輸入後,程式執行最終結果
演算法二:一種好的方法是用檔案——把輸入資料儲存在檔案中,輸出資料也儲存在檔案中。
例題2.6 資料統計ii(與上例相同,但告訴了n值,以及要求測試多組資料,輸入n = 0時結束輸入)
演算法分析:若此處用自己設定的max和min,要注意上組資料對下組陣列的影響,故應當將max和min在迴圈體內重新賦初值。
#include #define inf 100000000
int main()
printf("case %d: %d %d %.3f\n", ++kase, min, max, (double)s/n);
} return 0;
}
習題2.4:子串行的和(輸入兩正整數n < m < 10^5,輸出1/n^2 + 1/(n+1)^2 + ……+1/m^2,保留5位小數,輸入包含多組資料,n=m=0時結束輸入)
演算法分析:需要注意的就是每一項都應該轉換為浮點數,然後累加。用c++實現如下:
#include #include using namespace std;
int main()
cout<
習題2.5:分數化小數(輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位,a,b<=10^6, c<=100,輸入包含多組資料,a=b=c=0時結束輸入)
演算法分析:
#include using namespace std;
int ans1[110],ans2[110];
int main()
if(ans2[c+1]>=5) //進製
if(ans2[1]==10) //修改整數字
} cout<
習題2.6:排列(用1~9,組成3個三位數abc,def和ghi,每個數字恰好使用一次,使abc:def:ghi = 1:2:3,按格式「abc def ghi」輸出所有解,每行乙個)
演算法分析:
#include int main(void)
if (c == 10 && i2 != 0 && i3 != 0 && j2 != 0 && j3 != 0 && k2 != 0 && k3 != 0)
printf("%d %d %d\n", i, j, k);
}
return 0;
}
紫皮書 第2章 迴圈結構程式設計
2.1 for迴圈 例題 輸出1,2,3 cdots cdots n的值 程式2 1 includeusing namespace std int main 1 frac frac frac cdots cdots 直到最後一項小於10 6。分析 因為在計算完一項之後才知道它是否小於10 6,所以迴...
第6章 迴圈結構
while 先驗迴圈,先判斷在迴圈 do while 後驗迴圈 先執行,在判斷是否迴圈。for 先驗迴圈 while 表示式 迴圈體語句 do迴圈體語句 while 表示式 for 表示式1 表示式2 表示式3 迴圈體語句 表示式1為迴圈變數賦初值,表示式2為 迴圈結束的判斷條件 表示式3為改變迴圈...
第5章迴圈結構
1.迴圈結構 迴圈條件和迴圈操作,只要滿足迴圈條件,迴圈操作就反覆執行 2.while迴圈 1 語法 while 迴圈條件 2 流程圖 3 舉例 int i 1 while i 100 4 while 迴圈執行順序 1,宣告並初始化變數 2.判斷迴圈條件是否滿足,如果滿足執行迴圈操作,否則退出迴圈 ...