这十道题主要学习了一下string类的使用,就是几个函数的用法,用的过程中百度了一些东西,对string重新认识了一下,string提供了不少库函数供我们使用,所以解决问题的话先查查有没有相应提供的功能,没有的话自己再实现。

杭电ACM(2020-2029)

//2020绝对值排序
#include <iostream>
#include <algorithm> //使用sort函数进行排序
#include <math.h>

using namespace std;

//自定义排序函数
bool cmp(int x,int y)
{
	return abs(x) > abs(y);
}

int main()
{
	int n;
	int * num;
	while(cin>>n && n!=0)
	{
		num = new int[n];
		//读取输入数据
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
		}
		//使用sort函数进行排序
		sort(num,num+n,cmp);
		//输出
		for(int i=0;i<n;i++)
		{
			if(i != 0)
				cout<<" ";
			cout<<num[i];
		}
		cout<<endl;
		delete num;
	}

	return 0;
}

杭电ACM(2020-2029)

//2021发工资咯
#include <iostream>

using namespace std;

int main()
{
	int salary[] = {100,50,10,5,2,1};
	int n;
	int * num;
	int count;
	while(cin>>n && n!=0)
	{
		num = new int[n];
		count = 0;
		//读取输入数据
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
		}
		//进行判断
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<6;j++)
			{
				//找到和当前工资相等或者是小的面值
				if(num[i] < salary[j])
					continue;
				else
				{
					//使用如下的算法进行计算
					count += num[i]/salary[j];
					num[i] = num[i]%salary[j];
					if(num[i] == 0)
						break;
				}
			}
		}
		cout<<count<<endl;
		delete num;
	}
	return 0;
}

杭电ACM(2020-2029)

//2022海选女主角
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
	int m,n;
	int tem;
	//用来存放最大的值
	int max;
	//用来记录位置信息
	int x,y;
	while(cin>>m>>n)
	{
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				cin>>tem;
				if(i == 0 && j == 0)
				{
					//开始假设第一个数是最大的
					max = tem;
					x = i;
					y = j;
				}
					
				//进行比较,找到最大的
				if(abs(tem)>abs(max))
				{
					max = tem;
					x = i;
					y = j;
				}
			}
		}
		cout<<x+1<<" "<<y+1<<" "<<max<<endl;
	}
	return 0;
}

杭电ACM(2020-2029)

//2023求平均成绩
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int n,m;
	//这里要注意一下,要定义为double型,float型老是错误
	double sum;
	double ** score;
	int count;
	//为了提高效率我们可以使用文件重定向将标准输入重定向到文件,这样不用每次都输入测试数据了,直接从文件
    //中读取就好了,提交的时候注释掉这个重定向就好了
	freopen("1.txt","r",stdin);
	while(cin>>n>>m)
	{
		//多开辟一行的内存空间
		score = new double * [n+1];
		//分配内存空间,读取输入数据
		for(int i=0;i<n;i++)
		{
			sum = 0;
			//多开辟一块内存空间,用来存放平均值
			score[i] = new double[m+1];
			for(int j=0;j<m;j++)
			{
				 cin>>score[i][j];
				 sum += score[i][j];
			}
			score[i][m] = (double)sum/m;
		}
		
		//多开辟一行的内存空间
		score[n] = new double[m];
		for(int i=0;i<m;i++)
		{
			sum = 0;
			for(int j=0;j<n;j++)
			{
				sum += score[j][i];
			}
			score[n][i] = (double)sum/n;
		}

		//输出学生考试的平均分
		for(int i=0;i<n;i++)
		{
			if(i != 0)
				cout<<" ";
			cout<<fixed<<setprecision(2)<<score[i][m];
		}
		cout<<endl;

		//输出每门课程的平均得分
		for(int i=0;i<m;i++)
		{
			if(i != 0)
				cout<<" ";
			cout<<fixed<<setprecision(2)<<score[n][i];
		}
		cout<<endl;

		//判断人数
		count = 0;
		for(int i=0;i<n;i++)
		{
			int j;
			for(j=0;j<m;j++)
			{
				if(score[i][j] < score[n][j])
					break;
			}
			if(j == m)
				count++;
		}
		cout<<count<<endl<<endl;

		//释放内存
		for(int i=0;i<m+1;i++)
		{
			delete score[i];
		}
		delete score;
	}
	
	return 0;
}

杭电ACM(2020-2029)

//2024C语言合法标识符
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
	int n;
	string * text;
	while(cin>>n)
	{
		//清空回车键
		cin.ignore();
		text = new string[n];
		//读取输入数据
		for(int i=0;i<n;i++)
		{
			getline(cin,text[i]);
		}

		//进行判断
		for(int i=0;i<n;i++)
		{
			//第一个字符不能是数字,可以以下划线开头
			if(isdigit(text[i][0]))
			{
				cout<<"no"<<endl;
				continue;
			}
			
			//对每一个字符进行判断
			int j;
			for(j=0;j<text[i].size();j++)
			{
				if(!isalnum(text[i][j]) && text[i][j] != '_')
				{
					cout<<"no"<<endl;
					break;
				}
			}
			if(j == text[i].size())
				cout<<"yes"<<endl;
		}
		
		delete[] text;
	}
	
	return 0;
}

杭电ACM(2020-2029)

//2025查找最大元素
#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str;
	char max;
	while(cin>>str)
	{
		max = str[0];
		//获取最大的字符
		for(int i=0;i<str.size();i++)
		{
			if(str[i] > max)
				max = str[i];
		}
		
		//在最大的字符后边加上max
		for(int i=0;i<str.size();i++)
		{
			if(str[i] == max)
			{
				str.insert(i+1,"(max)");
				i += 5;
			}
		}
		cout<<str<<endl;
	}
	
	return 0;
}

杭电ACM(2020-2029)

//2026首字母变大写
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
	string str;
	while(getline(cin,str))
	{
		for(int i=0;i<str.size();i++)
		{
			if(i == 0)
				str[0] = toupper(str[0]);
			else if(str[i] == ' ')
				str[i+1] = toupper(str[i+1]);
		}
		cout<<str<<endl;
	}
	
	return 0;
}

杭电ACM(2020-2029)

//2027统计元音
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
	int n;
	int a,e,ii,o,u;
	cin>>n;
	cin.ignore();
	string * str = new string[n];
	for(int i=0;i<n;i++)
	{
		//读入数据
		getline(cin,str[i]);
	}

	//进行判断
	for(int i=0;i<n;i++)
	{
		a = e = ii = o = u = 0;
		//进行判断
		for(int j=0;j<str[i].size();j++)
		{
			switch(str[i][j])
			{
			case 'a':
				a++;
				break;
			case 'e':
				e++;
				break;
			case 'i':
				ii++;
				break;
			case 'o':
				o++;
				break;
			case 'u':
				u++;
				break;
			}
		}
		cout<<"a:"<<a<<endl;
		cout<<"e:"<<e<<endl;
		cout<<"i:"<<ii<<endl;
		cout<<"o:"<<o<<endl;
		cout<<"u:"<<u<<endl;
		if(i != n-1)
			cout<<endl;
	}
	
	delete [] str;
	return 0;
}

杭电ACM(2020-2029)

//2028Lowest Common Multiple Plus
#include <iostream>

using namespace std;

//计算俩个数的最大公约数的函数
int gcd(int x,int y)
{
	int tem;
	if(x < y)
	{
		tem = x;
		x = y;
		y = tem;
	}
	//x中保存的是较大的数,y中保存的是较小的数
	int r = x%y;
	//以下就是利用辗转相除法求最大公约数的方法
	while(r != 0)
	{
		x = y;
		y = r;
		r = x%y;
	}

	return y;
}

/*要想求最小公倍数,先得求最大公约数,因为俩个数的最小公倍数等于俩个数的积和最大公约数的比,而要求n的数的最小
公倍数,先得求俩个数的最小公倍数,因为n个数的最小公倍数等于俩个数的最小公倍数和第三个数的最小公倍数,然后
依次类推*/

int main()
{
	int n;
	//注意数据类型
	long * num;
	long long tem;
	long long result;
	while(cin>>n)
	{
		num = new long[n];
		//读取输入数据
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
		}

		//方法如下,先求2个数的最小公倍数
		tem = gcd(num[0],num[1]);
		result = num[0]*num[1]/tem;
		//再求n个数的最小公倍数
		for(int i=2;i<n;i ++)
		{
			tem = gcd(result,num[i]);
			result= result*num[i]/tem;
		}
		cout<<result<<endl;

		delete [] num;
	}

	return 0;
}

杭电ACM(2020-2029)

//2029Palindromes _easy version
#include <iostream>
#include <string>

using namespace std;

int main()
{
	int n;
	cin>>n;
	cin.ignore();
	string * str = new string[n];
	//读入n个数据
	for(int i=0;i<n;i++)
	{
		getline(cin,str[i]);
	}

	//判断
	for(int i=0;i<n;i++)
	{
		bool flag = true;
		int len = str[i].size();
		for(int j=0;j<len/2;j++)
		{
			if(str[i][j] != str[i][len-j-1])
			{
				flag = false;
				cout<<"no"<<endl;
				break;
			}
		}
		if(flag)
		{
			cout<<"yes"<<endl;
		}
	}

	delete [] str;
	return 0;
}