一、多项式输出
P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷
题目描述
一元 n 次多项式可用如下的表达式表示:
f(x)=anxn+an−1xn−1+⋯+a1x+a0,an≠0
其中,aixi 称为 i 次项,ai 称为 i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
-
多项式中自变量为 x,从左到右按照次数递减顺序给出多项式。
-
多项式中只包含系数不为 0 的项。
-
如果多项式 n 次项系数为正,则多项式开头不出
+号,如果多项式 n 次项系数为负,则多项式以-号开头。 -
对于不是最高次的项,以
+号或者-号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1,则无需输出 1)。如果 x 的指数大于 1,则接下来紧跟的指数部分的形式为"xb",其中 b 为 x 的指数;如果 x 的指数为 1,则接下来紧跟的指数部分形式为 x;如果 x 的指数为 0,则仅需输出系数即可。 -
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 2 行。
第一行 1 个整数,n,表示一元多项式的次数。
第二行有 n+1 个整数,其中第 i 个整数表示第 n−i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 1 行,按题目所述格式输出多项式。
输入输出样例
输入 #1复制运行
5
100 -1 1 -3 0 10
输出 #1复制运行
100x^5-x^4+x^3-3x^2+10
输入 #2复制运行
3
-50 0 0 1
输出 #2复制运行
-50x^3+1
说明/提示
NOIP 2009 普及组 第一题
对于100%数据,0≤n≤100,−100≤系数≤100
upd 2022.8.1:新增加一组 Hack 数据。

cpp
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int i = 0;
int x;
for (i = n;i >= 0;i--)
{
cin>>x;
if(x==0)
continue;
//符号
if(x>0 && i!=n)
cout<<"+";
else if(x<0)
cout<<"-";
//数字
x=abs(x);
if(x!=1 ||(x==1&&i==0))
cout<<x;
//次数
if(i>1)
cout<<"x^"<<i;
else if(i==1)
cout<<"x";
}
if (n == 0 && x == 0)
cout << "0";
return 0;
}
二、矩阵填数
题目描述
给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
输入输出样例
输入 #1复制
4
输出 #1复制
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
说明/提示
数据保证,1≤n≤9。
1.定义方向向量

2.根据规则结合方向向量填数
①朝一个方向走,一边走一边填数,直到越界
如图:(1,5)已经越界。

②越界之后,结合方向向量,重新计算出新的坐标以及方向
判断越界:坐标越界+已经填过数

更新pos的值:pos=(pos+1)%4
cpp
#include<iostream>
using namespace std;
//定义右、下、左、上四个方向
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
int arr[20][20];
int main()
{
int n = 0;
cin >> n;
//当前位置要填的数
int cnt = 0;
//初始位置
int x = 1;
int y = 1;
//当前的方向
int pos = 0;
int i = 0;
int j = 0;
while (cnt < n * n)
{
cnt++;
arr[x][y] = cnt;
//计算下一个位置
int a = x + dx[pos];
int b = y + dy[pos];
//判断是否越界
if (a > n || a<1 || b>n || b < 1 || arr[a][b] != 0)
{
//更新出正确的位置
pos = (pos + 1) % 4;
a = x + dx[pos];
b = y + dy[pos];
}
x = a;
y = b;
}
for (i = 1;i <= n;i++)
{
for (j = 1;j <= n;j++)
printf("%3d", arr[i][j]);
cout << endl;
}
return 0;
}