1. 程式人生 > >程式設計與演算法-列舉

程式設計與演算法-列舉

列舉

基於逐個嘗試答案的一種問題求解策略。

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、“生理週期”

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述