程式設計與演算法-列舉
阿新 • • 發佈:2018-11-05
列舉
基於逐個嘗試答案的一種問題求解策略。
1、例如:求小於N的最大素數
- 找不到一個數學公式,使得根據N就可以直接計算出這個最大素數。
- N-1是素數嗎?
- N-2是素數嗎?
- …
-> 判斷N-i是否為素數的問題
-> 轉化為求小於N的全部素數(可以用篩選法)
【C++實現】
#include <iostream> #include <math.h> using namespace std; bool is_preNum(int Num) { for (int i = 2; i <= sqrt(Num); i++){ if (Num%i == 0){ return false; } } return true; } int main() { int N; cout<< "Please Input a int Num(>=2):" << endl; cin >> N; if (N < 2) { cout << "Error Num" << endl; return 0; } for (int i = N - 1; i >=2; i--) { if (is_preNum(i)) { cout << "The max prenum is :" << i << endl; break; } } system("pause"); return 0; }
2、“完美立方”
解題思路:
四重迴圈列舉a, b, c, d, 且a 在最外層,d 在最裡層,每一層都是從小打到列舉,
- a 的列舉範圍是A[2, N]
- b 的列舉範圍是B[2, a-1 ]
- c 的列舉範圍是C[b, a-1]
- d 的列舉範圍是D[c, a-1]
合理的選取列舉範圍,能減少不必要的運算。
#include <iostream> #include <time.h> using namespace std; int main() { int N; double start, stop; start = clock(); std::cin >> N; start = clock(); for (int a = 2; a <= N; ++a) { //列舉a∈[2,N] for (int b = 2; b < a; ++b) { //對於每一個a,列舉b∈[2,a-1] for (int c = b; c < a; ++c) { //對於每一個a和b,列舉c∈[b,a-1] for (int d = c; d < a; ++d) { //對於每一個a\b\c,列舉d∈[c,a-1] if (a*a*a == b * b*b + c * c*c + d * d*d) //若枚舉出一組資料滿足要求,則列印輸出 std::cout << "Cude=" << a << '\t' << "Triple=" << b << '\t' << c << '\t' << d << endl; } } } } stop = clock(); double duration = (stop - start) / CLK_TCK; //To calculate the time that this function used std::cout << stop - start <<'\t'<<duration << endl; system("pause"); //Check results return 0; }
3、“生理週期”