第一行——咕咕咕。
第二行——他们都说这门课学完后会觉得自己啥算法都会。
一、gcd
要求:输入一组数据,输出相应的a,b和a%b以及最后的gcd
#include <cstdio>
#include <iostream>
using namespace std;
int EuclidGCD(int a, int b)
{
int r;
while(b)
{
r = a % b;
printf("相应的a b和r分别为:%d %d %d\n",a,b,r);
a = b;
b = r;
}
printf("相应的a b和r分别为:%d %d %d\n",a,b,r);
return a;
}
int main()
{
int a,b;
printf("请输入相应的a,b值:\n");
cin>>a>>b;
printf("\n");
int res = EuclidGCD(a,b);
printf("\n%d和%d的gcd为:%d\n",a,b,res);
return 0;
}
二、洗牌算法(随机数)
编程实现洗牌算法。使用C++,将伪随机函数改为C++11版的伪随机函数。
#include <ctime>
#include <cstdio>
#include <iostream>
#include <vector>
#include <random>
using namespace std;
vector<int> pai;
void xipai()
{
int n = pai.size();
if(n <= 0) return ;
random_device rdev{};
default_random_engine e{rdev()};
uniform_int_distribution<int> rnd{1, n};
for(int i = 0; i < n; i++)
{
int chou = rnd(e);
swap(pai[chou], pai[i]);
}
}
int main()
{
int n;
printf("请输入牌的数量:");
cin>>n;
printf("请依次输入牌面:");
for(int i = 0; i < n; ++i)
{
int a;
cin>>a;
pai.push_back(a);
}
printf("未洗牌时的顺序为:");
for(int i = 0; i < n; ++i)
cout<<pai[i]<<' ';
cout<<'\n';
xipai();
printf("洗牌后的顺序为:");
for(int i = 0; i < n; ++i)
cout<<pai[i]<<' ';
return 0;
}
三、线性查找算法
编程实现线性搜索算法。使用C++,将伪随机函数改为传统C语言中的伪随机函数。
#include <vector>
#include <random>
#include <cstdio>
#include <iostream>
#include <ctime>
using namespace std;
vector<int>a;
int RandIntRange(int low, int high)
{
return rand() % (high-low+1) + low;
}
int LinearSearch(int x)
{
int n = a.size();
int p = 0;
while ( p < n && x != a[p])
p++;
if (p == n)
p = -1;
return p;
}
int main()
{
int n;
printf("请输入数组的长度:");
cin>>n;
printf("请输入%d个数的值:", n);
for(int i = 0; i < n; ++i)
{
int c;
cin>>c;
a.push_back(c);
}
srand(time(0));
int x = RandIntRange(0,200);
int res = LinearSearch(x);
printf("待查元素: %d\n", x);
if (res != -1) printf("位置: %d\n", res);
else printf("未找到!\n");
}
四、子集遍历并求出运算时间
#include <iostream>
#include <cstdio>
#include <vector>
#include <ctime>
using namespace std;
static vector<int> x;
void OutputOneSubsetBinary()
{
static int cnt = 0;
printf("%03d: ", ++cnt);
for(int i = x.size()-1; i >= 0; --i)
{
printf("%d",x[i]);
}
}
void OutputOneSubset()
{
printf(";{");
int k = 0;
for(int i = x.size()-1; i >= 0; --i)
{
if(x[i] == 1)
{
if(k > 0) printf(",");
printf("%d", i);
k++;
}
}
printf("}");
}
void Subsetting(int n)
{
if(n > 0)
{
x.push_back(0);
Subsetting(n-1);
x.pop_back();
x.push_back(1);
Subsetting(n-1);
x.pop_back();
}
else
{
OutputOneSubsetBinary();
OutputOneSubset();
printf("\n");
}
}
int main()
{
int n;
cout<<"请输入子集大小:"<<'\n';
cin>>n;
x.clear();
clock_t startTime,endTime;
startTime = clock();//计时开始
Subsetting(n);
endTime = clock();//计时结束
cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
五、bfs和dfs
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
//bfs
using namespace std;
queue<int> q;
int edge[15][15];
int n;
void bfs(int aim)
{
bool visit[15];
memset(visit,false,sizeof(visit));
string s = "访问节点的顺序是:";
q.push(aim);
while(!q.empty())
{
int up = q.front();
q.pop();
s = s+"节点"+char(up+48)+" ";//形成一个字符串输出
visit[up] = true;
for(int i = 1; i <= n; ++i)
{
if(edge[up][i] == 1 && !visit[i])
{
q.push(i);
visit[i] = true;
}
}
}
cout<<s<<'\n';
}
int main()
{
int aim;
cout<<"请输入邻接矩阵的节点个数:\n";
cin>>n;
cout<<"请输入该矩阵:\n";
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
cin>>edge[i][j];
}
cout<<"请输入起点:\n";
cin>>aim;
bfs(aim);
return 0;
}
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
//dfs
using namespace std;
queue<int> q;
int edge[15][15];
int n;
bool visit[15];
string s = "访问节点的顺序是:";
int tot = 0;
void dfs(int aim)
{
visit[aim] = 1;
tot++;
s = s+"节点"+char(aim+48)+" ";
if(tot == n) return;
for(int i = 1; i <= n; ++i)
{
if(!visit[i] && edge[aim][i] == 1)
{
dfs(i);
}
}
}
int main()
{
int aim;
cout<<"请输入邻接矩阵的节点个数:\n";
cin>>n;
cout<<"请输入该矩阵:\n";
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
cin>>edge[i][j];
}
cout<<"请输入起点:\n";
cin>>aim;
memset(visit,false,sizeof(visit));
dfs(aim);
cout<<s<<'\n';
return 0;
}