构造法

构造法:(1)数学建模,累加和累乘法,复杂问题有:平面分割问题,需要组合数学问题,求第K个大的数,其模型对应快速排序的改进。

(1)计算π的值

计算π的值方法有很多种。

问题描述:计算π的近似值,要求输入躺数,求π的值。

#include<iostream>
using namespace std;
double getNum(int n){
	int f = 1;
	double s = 0;//累加器
	for (int i = 1; i <= n; i+=2){//加2对所有的奇数计算
		s += 1.0*f / i;
		f = -f;
	}
	return 4 * s;
}
int main(){
	int n;
	cin >> n;
	double s = getNum(n);
	cout << s << endl;
	system("pause");
	return 0;
}

(2)求n的阶乘   基本数据结构long   大整数的阶乘

//求阶乘
#include<iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	long t = 1;
	for (int i = n; i >=1; i--){
		t = t*i;
	}
	cout << t << endl;
	system("pause");
	return 0;
}

(3)求第k大的数

//求第K大的数,已知n个数字个不相同,求第k大的数
/*
改进的快速排序方式,反复进行快速排序,每次快速排序之后都将枢轴量与下标为k的数比较
*/
#include<iostream>
using namespace std;
const int N = 100;
int a[N];
//定义一次快速排序的过程
int sort(int *a, int low, int high){
	int pivot = a[low];
	while (low < high){
		while (a[high] <= pivot&&low<high){
			high--;
		}
		a[low] = a[high];
		while (a[low]>=pivot&&low < high){
			low++;
		}
		a[high] = a[low];
	}
	a[low] = pivot;
	return low;//通过枢轴量的下标与k比较
}
int quickSort(int *a, int low, int high, int k){
	if (low >= high){
		return a[low];
	}
	else{
		int mid = sort(a, low, high);
		if (mid > k){
			quickSort(a, low, mid - 1,k);
		}
		else if (mid < k){
			quickSort(a, mid + 1, high, k);
		}
		else{
			return a[mid];
		}
	}
}
int main(){
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++){
		cin >> a[i];
	}
	int res=quickSort(a, 0, n - 1, m-1);//数组名就是数组的首地址
	cout << res << endl;
	system("pause");
	return 0;
}

(4)比赛日程表

//设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,
//循环赛共进行N-1天,要求每天没有选手轮空。
#include<iostream>
using namespace std;
void table(int n){
	int a[100][100];
	int temp = 0;
	int k = 1;
	a[1][1] = 1;
	for (int t = 0; t < n; t++){
		temp = k; k = k * 2;
		//求左下角
		for (int i = temp + 1; i <= k; i++){
			for (int j = 1; j <= temp; j++){
				a[i][j] = a[i - temp][j] + temp;
			}
		}
		//右上角
		for (int i = 1; i <= temp; i++){
			for (int j = temp + 1; j <= k; j++){
				a[i][j] = a[i + temp][(j + temp) % k];
			}
		}
		//右下角
		for (int i = temp + 1; i <= k; i++){
			for (int j = temp + 1; j <= k; j++){
				a[i][j] = a[i - temp][j - temp];
			}
		}
	}
	for (int i = 1; i <= k; i++){
		for (int j = 1; j <= k; j++){
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
}
int main(){
	int n;
	cin >> n;
	table(n);
	system("pause");
	return 0;
}

(5)奇数阶魔方

/*
奇数阶魔方的规律:(1)自然数1出现在第一行的正中间
(2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行),且列数加1
(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧
(4)一般的,下一个数字再签一个数字的右上方(行数少1,列数加1)
(5)若应填的地方有数字或在方阵之外,则下一个数字就填在前一个数字的下方(一般的,n的倍数的下一个数字就在该数下方)
*/

 

posted @ 2020-10-20 00:50  goldstine  阅读(665)  评论(0)    收藏  举报