
༺ 个人主页 · 纪念229 ༻
༒专栏目录:《算法》༒
༒专栏目录:《C++》༒
༒专栏目录:《MySQL数据库》༒
༒专栏目录:《前端开发》༒
༺世上本没有路,走的人多了自然就有了༻
本篇文章讲述的是C++基本算法模版中的模拟,其实就是先把题目要求做的事在草稿纸上写好然后根据要求写代码(个人觉得有点难难在理解题意还要将其转化为代码这也是算法竞赛第一题上位置的题目)
以后我会更新算法基础的文章要讲解的东西一般就是()里面的东西,有关算法基础的题目以后都是全代码模式以后就不赘述了
文章目录
1.多项式输出


题目要求我们输入最大次数
然后在输入每个次数的系数
c
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n; cin >> n;
for(int i = n; i>=0; i--)
{
int num; cin >> num;
char ch;
// if(i == n){
// ch = num > 0 ? '' : '-'; //char对象里没有''字符建议不存直接先打印
// }else{
// ch = num > 0 ? '+' : '-';
// }
//先打印正负字符
if(i == n){
if(num < 0) cout << '-';
}else{
if(num > 0) cout << '+';
if(num < 0) cout << '-';
}
//再打印数字 最后打印次方
num = abs(num);//abs作用取整数的绝对值头文件是cmath
//num为0时什么都不打
if(num == 1){
//如果i == 0的时候直接打印数字
if(i == 0) cout << num;
if(i == 1) cout << 'x';
if(i > 1) cout << "x^" << i;
}
if(num > 1){
if(i == 0) cout << num;
if(i == 1) cout << num << 'x';
if(i > 1) cout << num << "x^" << i;
}
}
return 0;
}
这里我们推断出打印多项式首先是看符号(如果是刚开始系数小于0就打印字符'-'大于0不用管之后系数大于0打印'+'小于0打印'-')然后看系数因为我们先管了符号所以我们首先要将系数取绝对值然后我们还要分为三种情况系数为0(直接不管即可)系数为1我们要看次数为几次数为0直接打印系数次数为1就直接打印x如果次数大于1我们就打印x的次方其次系数大于1当次数为0直接打印系数当次数为1先打印系数再打印x如果次数大于1先打印系数再打印x的次方
是的模拟很麻烦我们必须要在草稿纸上写好条件还要将其实现下来(其实做大多数算法题都需要草稿纸)
这里我就讲一下核心代码
c
int n; cin >> n;
for(int i = n; i>=0; i--)
{
int num; cin >> num;
char ch;
// if(i == n){
// ch = num > 0 ? '' : '-'; //char对象里没有''字符建议不存直接先打印
// }else{
// ch = num > 0 ? '+' : '-';
// }
//先打印正负字符
if(i == n){
if(num < 0) cout << '-';
}else{
if(num > 0) cout << '+';
if(num < 0) cout << '-';
}
//再打印数字 最后打印次方
num = abs(num);//abs作用取整数的绝对值头文件是cmath
//num为0时什么都不打
if(num == 1){
//如果i == 0的时候直接打印数字
if(i == 0) cout << num;
if(i == 1) cout << 'x';
if(i > 1) cout << "x^" << i;
}
if(num > 1){
if(i == 0) cout << num;
if(i == 1) cout << num << 'x';
if(i > 1) cout << num << "x^" << i;
}
}
我们首先输入n定义该多项式最多为n次
我们利用for循环先从n开始到0也就实现了输出的基本框架
然后我们定义一个num输入系数
c
if(i == n){
if(num < 0) cout << '-';
}else{
if(num > 0) cout << '+';
if(num < 0) cout << '-';
}
首先我们要看正负符号分两种一种次数为n一种次数不为n为n的话我们看它的系数小于0的话就打印'-'其它不管系数为0符号什么都不打印次数不为1的话系数大于0打印符号'+'小于0打印'-'
然后我们将num取绝对值调用函数abs()将整形数据的负号去掉
abs的头文件是cmath
然后我们将系数分为三种为0为1大于1
为0什么都不用打印
为1当次数为0的话直接打印系数为1的话直接打印x大于一的话打印x的次方
系数大于1的话当次数为0时打印系数次数为1时打印系数再打印x系数大于1打印系数再打印x的次方
c
if(num == 1){
//如果i == 0的时候直接打印数字
if(i == 0) cout << num;
if(i == 1) cout << 'x';
if(i > 1) cout << "x^" << i;
}
if(num > 1){
if(i == 0) cout << num;
if(i == 1) cout << num << 'x';
if(i > 1) cout << num << "x^" << i;
}
2.蛇形方阵

给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字都会占用 3 个字符,前面使用空格补齐。
题目意思很简单就是我们输入一个数字n我们就设计一个长宽都为n的矩形从左上角开始顺时针填充数字第一个填1之后每填一个改数字就加一
这种矩形填充数的方式我们建议用向量法(我们定义两个数组写好每个数组都有4个元素用一个下标决定它处于哪个位置4个下标定义着4个在矩形的4个方向当我们越界时就更新下标改变移动方向)
c
#include<iostream>
using namespace std;
const int N = 15;//下标大于等于10就可以因为矩阵最大为9
int arr[N][N];//数组在全局未定义
//顺时针填矩阵用向量法填矩阵
//向量法在矩阵填数据我们从1,1开始填0,x和0, x不用管这样填数据更好看
//顺时针插入右下左上利用pos 实行上下左右的移动
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int main()
{
int n; cin >> n;
int x = 1, y = 1, pos = 0;//利用pos下标确定移动方向,下标x,y确定路径位置
int cunt = 1;//利用cunt作为填入的数据
//利用while循环遍历顺时针插入矩阵
while(cunt <= n*n)
{
arr[x][y] = cunt;
//利用a,b更新坐标位置
int a = x + dx[pos], b = y + dy[pos];
//越界/遇到已经插入的地方就更新方向
if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方
{
pos = (pos + 1) % 4;
//更新正确坐标
a = x + dx[pos], b = y + dy[pos];
}
//更新坐标
x = a, y = b;
//最后++count循环遍历
cunt++;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
//题目只要求打印的数字占三个字符没要求空格
printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组
}
puts("");//作用打印字符串之后自动添加换行符
}
return 0;
}
首先题目要求我们最大数组边界不会大于9所以我们定义一个大于等于10的矩形在全局即可(定义在全局对向量移动有大作用)
c
const int N = 15;//下标大于等于10就可以因为矩阵最大为9
int arr[N][N];//数组在全局未定义
我们定义dx和dy作为方向向量作为移动的反向
c
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
这里我们设计的方向向量设计的是顺时针右下左上(我们这里坐标轴正下是x轴方向正右是y轴方向)
c
int n; cin >> n;
int x = 1, y = 1, pos = 0;//利用pos下标确定移动方向,下标x,y确定路径位置
int cunt = 1;//利用cunt作为填入的数据
首先我们先定义一个n输入n决定数组的边界
在定义x,y为1,pos为0
x y是矩形数组的下标 pos是向量数组的下标
x和y为1开始我们从1,1开始(0,x)和(x, 0)我们都不用管我们从(1,1)开始是为了方便运算移动好看
c
while(cunt <= n*n)
{
arr[x][y] = cunt;
//利用a,b更新坐标位置
int a = x + dx[pos], b = y + dy[pos];
//越界/遇到已经插入的地方就更新方向
if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方
{
pos = (pos + 1) % 4;
//更新正确坐标
a = x + dx[pos], b = y + dy[pos];
}
//更新坐标
x = a, y = b;
//最后++count循环遍历
cunt++;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
//题目只要求打印的数字占三个字符没要求空格
printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组
}
puts("");//作用打印字符串之后自动添加换行符
}
在外面定义一个cunt为1
利用whlie循环遍历 n*n次因为我们要插入n * n次 cunt <= n * n
首先我们利用x,y在该位置插入cunt然后定义a和b来更新向量方向分两种情况正常移动更新下标和遇到越界或非0数据我们就更新向量方向再更新坐标
最后将a和b(更新好的下标)放入x 和y最后将cunt++继续循环
c
int a = x + dx[pos], b = y + dy[pos];
//越界/遇到已经插入的地方就更新方向
if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方
{
pos = (pos + 1) % 4;
//更新正确坐标
a = x + dx[pos], b = y + dy[pos];
}
//更新坐标
x = a, y = b;
//最后++count循环遍历
cunt++;
这里更新向量方向其实就是改变pos下标
每次加一 / 4当到了上以后加就有回到右
c
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
//题目只要求打印的数字占三个字符没要求空格
printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组
}
puts("");//作用打印字符串之后自动添加换行符
}
最后利用两个for循环将填好的数据打印出来题目要求每个数据以三字节打印不需要空格只要每个循环之后换行即可
文章到此就告一段落,希望对你有所帮助,感谢观看!