构造法
构造法:(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的倍数的下一个数字就在该数下方)
*/

浙公网安备 33010602011771号