【模拟】多项式输出 & 蛇形方阵 & 字符串展开

目录

一、多项式输出

二、蛇形方阵

三、字符串展开


一、多项式输出

P1067 NOIP 2009 普及组 多项式输出 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	int n; cin >> n;
	for(int i = n; i >= 0; i--)
	{
		int a; cin>>a;
		if(a == 0) continue;
		
		//符号
		if(a < 0)
		{
			cout << '-';
		}
		else{
			if(i != n)
			{
				cout << '+';
			}
		}
		
		//数字
		a = abs(a);
		if(a != 1 || (a == 1 && i == 0))
		{
			cout << a;
		}
		
		//次幂 
		if(i == 1)
		{
			cout<<'x';
		}
		else if (i > 1)
		{
			cout << "x^" << i;
		} 
	}
	return 0;
} 

二、蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
using namespace std;

int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};

const int N = 15;

int arr[N][N];

int main()
{
	int n; cin >> n;
	int x = 1, y = 1;
	int pos = 0;
	int cnt = 1;
	while(cnt <= n*n)
	{
		arr[x][y] = cnt;
		int a = x + dx[pos];
		int b = y + dy[pos];
		
		if(a<1 || a>n || b<1 || b>n || arr[a][b])
		{
			pos = (pos+1)%4;
			a = x + dx[pos];
			b = y + dy[pos]; 
		}
		x = a; y = b;
		cnt++;
	}
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			printf("%3d",arr[i][j]); 
		}
		cout << endl;
	}
	return 0;
} 

三、字符串展开

P1098 NOIP 2007 提高组 字符串的展开 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int p1,p2,p3;
string s;
int n;
string ret; 

bool IsDigit(char ch)
{
	return ch >= '0' && ch <= '9';
}

bool IsLeter(char ch)
{
	return ch >= 'a' && ch <= 'z';
}

void add(char left, char right)
{
	string str;
	for(char ch = left + 1; ch < right; ch++)
	{
		char tmp = ch;
		
		//处理p1
		if(p1 == 2 && IsLeter(ch))
		{
			tmp -= 32;
		}
		else if(p1 == 3)
		{
			tmp = '*';
		}
		
		//处理p2
		for(int i = 1; i <= p2; i++)
		{
			str += tmp;
		}
	}
	//处理p3
	if(p3 == 2)
	{
		reverse(str.begin(), str.end());
	} 
	ret += str;
}

int main()
{
	cin>>p1>>p2>>p3>>s;
	n = s.size();
	for(int i = 0; i < n; i++)
	{
		char ch = s[i];
		if(ch != '-' || i == 0 || i == n-1)
		{
			ret += ch;
		}
		else{
			char left = s[i-1];
			char right = s[i+1];
			if((IsDigit(left) && IsDigit(right) && left < right)
			|| (IsLeter(left) && IsLeter(right) && left < right))
			{
				//展开
				add(left ,right); 
			}
			else{
				ret += ch;
			}
		}
	}
	cout << ret << endl;
	return 0;
} 
相关推荐
listhi52012 小时前
基于MATLAB的自适应粒子群算法(APSO)实现大规模分类特征选择
算法·matlab·分类
weixin_4074438712 小时前
基于Sentinel-1/2数据特征优选的冬小麦识别
人工智能·算法·随机森林·机器学习·sentinel
智者知已应修善业12 小时前
【51单片机按键加减1若不释放自动加减】2023-11-24
c++·经验分享·笔记·算法·51单片机
basketball61612 小时前
C++ 手写实现迭代器
开发语言·c++
zavoryn12 小时前
大模型入门:从 MHA 到 GQA,一次讲清 KV Cache 为什么能省显存
人工智能·算法
萧戈12 小时前
c++条件变量的使用
开发语言·c++
骄马之死12 小时前
ThreadLocal 核心原理
java·jvm·算法
周末也要写八哥12 小时前
经典算法题之删列造序(二)
数据结构·算法
此生决int12 小时前
C++快速上手java备战期末考——运算符,输入输出和数组
java·c++·期末复习