时间复杂度
看一下每个的例子
log N
nlogN
n^2
空间复杂度
几个算法
辗转相除法
具体过程:输入两个数,取出较大的一个记作m,小的记作n,然后取余得到r,将n赋给m,r赋给n,在做运算直到n为零
#pragma once
#include<iostream>
using namespace std;
class ZXC
{public:
bool execute(int m, int n);
};
//cpp文件
#include"zxc.h"
bool
ZXC::execute(int m, int n)
{
int r = 0;
if (m < n)
{//如果m比n小就交换
m = m + n;
n = m - n;
m = m - n;
}
while (n != 0)
{
r = m % n;
m = n;
n = r;
}
cout<<"最大公因数是"<<m<<endl;
return 1;
}
这个时间复杂度应该小于logN
韩信点兵
关注保证上次的条件成立然后赵下一个条件什么时候成立
#pragma once
#include<iostream>
using namespace std;
class HDB
{
public:
bool
execute();
};
//cpp文件
#include "HDB.h"
bool
HDB::execute()
{
//除三余2,除5余3,除11余7,除23余5,求在1000-20000之间的所有数
int n = 2;
while (n % 5 != 3)n += 3;//保证满足前面的条件来找满足下一个条件的数
while (n % 11 != 7)n += 15;
while (n % 23 != 5)n += 165;//找到最小的符合要求的数
if (n > 20000)cout<<"没有"<<endl;
else
{
while (n < 20000)
{
if (n > 1000)
cout << n << " ";
n += 165 * 23;//
}
}
return 1;
}
时间复杂度为logN
幻方问题:
每种情况试过去肯定不行,我们需要一个精妙的的设计
蓝字是出现顺序
黄框是第二种情况的处理
蓝框是第三个情况的处理
练习
答案
- main函数
#include"fun.h"
int main()
{
double x;
cout << “请输入x的值” << endl;
cin >> x;
Fun().execute(x);
return 0;
}
Fun.h文件
#pragma once
#include
using namespace std;
class Fun
{
public:
bool execute(double x);//代入x
};
fun.Cpp文件
#include “fun.h”
bool
Fun::execute(double x)
{
//函数表达式为f(x)=3x3+2*x2+x+4
cout<<"函数表达式为f(x)=3x3+2*x2+x+4"<<endl;
cout<<“值为”<<((3*x+2)*x+1)*x+4<<endl;//减少乘法的次数
return 1;
}
结果: