实训A
问题A:比较大小
题目描述
给定两个整数A,B(1≤A,B≤1000),请判断两数的关系。
输入
第一行整数T表示测试数据组数。接下来T行每行两个整数分别表示A,B。 如果A<B输出Smaller,如果A=B输出Equal,如果A>B输出Bigger。
输出
每行输出一个答案
样例输入
3
4 5
3 3
4 3
样例输出
Smaller
Equal
Bigger
代码
#include <iostream> //CPP头文件
using namespace std; //命名空间std
int main() { //主函数入口
int a,b,num; // 比较字符a,b和测试数据组数
cin >> num; //从键盘得到测试数据组数
while(num--){ //循环n次
cin >> a >> b; //读取a,b数值
if(a > b) //如果大输出Bigger
cout << "Bigger"<<endl;
else if( a== b ) //如果等于输出Equal
cout << "Equal"<<endl;
else //如果小则输出Smaller
cout << "Smaller"<<endl;
}
return 0; //程序结束
}
问题B: 一个@字符矩形
题目描述
根据读入的n值,输出以@为填充字符,宽为20,高为n的字符矩形。
输入
输入数据只有一个正整数n(1≤n≤50)。
输出
输出以@为填充字符,宽为20,高为n的字符矩形。显然为了结束每行字符,在输出20个@字符后,应输出一个回车,最后一行也必须与前面一样输出回车,否则提交系统不会予以认可。
样例输入
5
样例输出
@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
代码
#include <iostream> //CPP头文件
using namespace std; //命名空间std
int main() { //主函数入口
int n; //高为n的字符矩形
cin >> n; //从键盘得到数组n
while(n--){ // 循环n次
for(int i=0;i<20;i++){ //每行输出20个@
cout <<"@";
}
cout << endl; //换行
}
return 0; //程序结束
}
问题C: 最大公约数和最小公倍数
题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入
两个整数
输出
最大公约数,最小公倍数
样例输入
5 7
样例输出
1 35
代码
#include <iostream> //CPP头文件
using namespace std; //命名空间std
int Get_Max_Comm_Divisor(int num1, int num2); //声明得到最大公约数函数
int main() { //主函数入口
int m,n,num; //两个数和最大公约数
cin >> m >> n; //从键盘获得两个数
num = Get_Max_Comm_Divisor(m,n) ; //根据最大公约数函数得到最大公约数并赋值给num
cout << num ; //输出最大公约数
cout <<" " <<m*n / num; //输出最小公倍数
return 0; //程序结束
}
int Get_Max_Comm_Divisor(int num1, int num2) //最大公约数函数
{
int remainder = num1 % num2; //余数
while(remainder != 0) //循环停止条件,余数为0
{
num1 = num2; //更新被除数
num2 = remainder; //更新除数
remainder = num1 % num2; //更新余数
}
return num2; //最后的除数即为最大公因数
}
问题D: 水仙花数
题目描述
打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=13 +53+33 。 Output:
153
???
???
???
输入
无
输出
所有的水仙花数,从小的开始。 每行一个
代码
#include <iostream> //输入输出流库
#include <cmath> //数学操作库
using namespace std; //命名空间
int GetFlower(int num); //声明水仙花函数
int main() { //主函数入口
int num=100; //从三位数开始寻找水仙花数
while(num<=999){ //循环终止条件,超过三位数
GetFlower(num); //判断水仙花数
num++; //进行下一个数
}
return 0; //程序结束
}
int GetFlower(int num){ //判断水仙花数函数
int sum=0; //三位数立方之和
sum += pow(num%10,3); //个位数立方
sum += pow (num/10%10,3); //十位数立方
sum += pow (num/100,3); //百位数立方
if(sum == num){ //如果满足水仙花数条件则输出
cout << sum << endl;
}
}
问题E: 第N次落地
题目描述
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
输入
M N
输出
它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行
样例输入
1000 5
样例输出
31.25 2875.00
代码
#include <iostream> //输入输出流库
#include <cmath> //数学操作库
#include <iomanip> //输入输出操作库
using namespace std; //命名空间std
int main() {
double M,N,sum=0; //声明变量
cin >> M >> N; //获得变量
while(N--){ //循环终止条件
sum += M + M/2; //求经过路径
M/=2; //反弹高度
}
cout<<setiosflags(ios::fixed); //设置保留两位小数
cout.precision(2);
cout << M << " " << sum -M; //输出反弹高度和经过多少米
return 0; //程序结束
}
问题F:画字符三角形
题目描述
根据读入的字符值,输出以该字符为填充字符的等腰三角形。
输入
输入数据只有一个字符值c(’A’≤c≤’Z’)。
输出
输出以c为填充字符,高为7,底边长为13的等腰三角形。同样,每行结束时应回车。
样例输入
A
样例输出
A
AAA
AAAAA
AAAAAAA
AAAAAAAAA
AAAAAAAAAAA
AAAAAAAAAAAAA
代码
#include <iostream> //输入输出流库
#include <cmath> //数学操作库
using namespace std; //命名空间std
int main() { //主函数入口
char ch; //声明字符变量
cin >> ch; //读取字符
if( ch >= 'A' && ch <= 'Z'){ //判断是否是输入条件范围内
for(int i=6; i>=0 ;--i){ //等腰三角形的高度
for(int j=i; j>0;--j){ //三角形前面的空格
cout << " ";
}
for(int k=13-2*i;k>0;--k){ //每行三角形字符数量
cout << ch ;
}
cout << endl; //输出换行符
}
}
return 0; //程序结束
}
问题G:冒泡法排序
题目描述
用冒泡法对10个整数从小到大排序。
输入
10个整数
输出
排序好的10个整数
样例输入
4 85 3 234 45 345 345 122 30 12
样例输出
3
4
12
30
45
85
122
234
345
345
代码
#include <iostream> //输入输出流库
using namespace std; //命名空间std
void bubbleSort(int arr[], int n) {// 冒泡排序函数
for (int i = 0; i < n; i++) {
bool swapped = false;
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 如果在整个内部循环中都没有交换,则数组已经排序
if (!swapped) {
break;
}
}
}
// 打印数组函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
cout << arr[i] << endl;
}
// 测试示例
int main() {
int n =10; //定义int类型n,赋值10
int arr[n]; //声明一个数组
for(int i=0;i<n;i++){ //通过for循环给数组赋值
cin >> arr[i];
}
bubbleSort(arr, n); //进行冒泡排序
printArray(arr, n); //打印排序好的数组
return 0; //程序结束
}
问题H: 矩阵对角线元素之和
题目描述
求一个3×3矩阵对角线元素之和。
输入
矩阵
输出
每行输出一个答案
样例输入
主对角线 副对角线 元素和
样例输出
1 2 3
1 1 1
3 2 1
代码
#include <iostream> //输入输出流库
using namespace std; //命名空间std
int main() { //主函数入口
int matrix[3][3]; //声明一个3*3的二维数组
// 输入矩阵
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cin >> matrix[i][j];
}
}
int mainDiagonalSum = 0; //声明一个int类型变量用来存放主对角线
int secondaryDiagonalSum = 0; //声明一个int变量用来存放副对角线
// 计算主对角线元素之和
for (int i = 0; i < 3; i++) {
mainDiagonalSum += matrix[i][i];
}
// 计算副对角线元素之和
for (int i = 0; i < 3; i++) {
secondaryDiagonalSum += matrix[i][2 - i];
}
// 输出结果
cout << mainDiagonalSum << " " <<secondaryDiagonalSum << endl;
return 0; //程序结束
}
问题I:逆序输出
题目描述
输入10个数字,然后逆序输出。
输入
十个整数
输出
逆序输出,空格分开
样例输入
1 2 3 4 5 6 7 8 9 0
样例输出
0 9 8 7 6 5 4 3 2 1
代码
#include <iostream> //输入输出流库
#include <vector> //vecotr容器库
using namespace std; //命名空间std
int main() { //主函数入口
vector<int> numbers; //声明一个int类型的vector容器
// 输入 10 个整数
for (int i = 0; i < 10; i++) {
int num;
cin >> num;
numbers.push_back(num); //插入到vecotr容器里
}
// 逆序输出整数,用空格分隔
for (int i = numbers.size() - 1; i >= 0; i--) {
cout << numbers[i] << " ";
}
return 0; //程序结束
}
问题J:字符串翻转
题目描述
写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。
输入
一个字符串
输出
逆序后的字符串
样例输入
123456abcdef
样例输出
fedcba654321
代码
#include <iostream> //输入输出流库
#include <string> //string字符串类型库
#include <algorithm> //定义执行算法的 C++ 标准库容器模板函数
using namespace std;
// 反转字符串的函数
string reverseString(string str) {
reverse(str.begin(), str.end()); //来自 <algorithm> 库的反转字符串函数
return str;
}
int main() {
string input; //声明一个字符串类型变量
cin >> input;
// 调用反转字符串的函数
string reversed = reverseString(input);
cout << reversed << endl; //输出反转后的函数
return 0; //程序结束
}
问题K:菲波那契数
题目描述
菲波那契(fibonacci)数(简称菲氏数)定义为:
f(0) = 0;
f(1) = 1;
f(n) = f(n-1) + f(n-2). n>1的整数
如果写出菲氏数列,则应该是:
0 1 1 2 3 5 8 13 21 34 …
如果求其第6项,则应为8。
求第n项菲氏数。
输入
输入正整数n(0≤n≤46)。
输出
计算第n项菲氏数
样例输入
10
样例输出
55
代码
#include <iostream> //输入输出流库
using namespace std; //命名空间
int fibonacci(int n) { //获得第N项斐波那契值的函数
if (n < 0 || n > 46) //不满足输入要求返回错误情况
return -1;
if (n == 0) //f(0)直接返回0
return 0;
if (n == 1)
return 1; //f(1)直接返回1
else
return fibonacci(n - 1) + fibonacci(n - 2); //递归函数调用
}
int main() { //主函数入口
int n; //声明int类型变量
cin >> n; //获得输入数值
int result = fibonacci(n); //声明int变量将第n项斐波那契函数值赋值给变量
if (result == -1) //如果输入范围错误直接程序结束
return 0;
else
cout << result << endl; //正确则输出正确结果
return 0; //程序结束
}
问题L:寻找幸运数
题目描述
给定三个整数(0≤A1,A2,A3≤10000),请找出第一个不大于168的数。 如果存在该数,输出"CRASH"并空一格输出该数,否则输出"NO CRASH"。 遇到A1=A2=A3=-1则运行结束。
输入
有多组数据,每行输入三个数
输出
输出相应答案
样例输入
180 160 170
169 170 200
-1 -1 -1
样例输出
CRASH 160
NO CRASH
代码
#include <iostream> //输入输出流库
#include <string> //string字符串库
#include <cstdlib> //包含标准 C 标准库标头 <stdlib.h> 并将关联名称添加到 std 命名空间
using namespace std; //std命名空间
void findNumber(int a1, int a2, int a3) { //寻找不大于168的数
if (a1 == a2 && a2 == a3 && a1 == -1) { //退出条件
exit(0);
}
//寻找没有大于168的数
if (a1 <=168) {
cout << "CRASH " << a1 << endl;
return; //找到则退出函数
}
else if( a2 <= 168){
cout << "CRASH " << a2 << endl;
return; //找到则退出函数
}
else if( a3 <= 168){
cout << "CRASH " << a3 << endl;
return; //找到则退出函数
}
// 没有找到不大于 168 的数
cout << "NO CRASH" << endl;
}
int main() { //主函数入口
int a1, a2, a3;
while (true) { //循环到停止为主
cin >> a1 >> a2 >> a3;
findNumber(a1, a2, a3); //调用寻找不大于168的函数
}
}
问题M:求等差数列的和
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有一些整数组,每三个整数为一组,分别表示等差数列的起始位置、终止位置和公差,求每组数列的和。
整数可能非常大,变量类型使用 long long ,对应scanf的格式使用 %lld
输入
每行输入三个数,如果三个整数都为0,表示输入结束。
输入
输出答案
输出
每行输出一个答案
样例输入
5 100 5
1 5 1
1 10 1
0 0 0
样例输出
1050
15
55
代码
#include <iostream> //输入输出流库
using namespace std; //命名空间std
long long calculateSum(long long firstTerm, long long lastTerm, long long n); //声明等差数列函数
int main() {
long long a,b,c; //声明三个变量代表等差数列的起始位置、终止位置和公差
while(true){ //循环到停止条件
cin >> a >> b >> c; //键盘读取三个变量值
if( a == 0 && b == 0 && c == 0){ //停止条件
return 0;
}
cout << calculateSum(a,b,(b-a)/c+1) << endl; //调用等差数列函数
}
return 0; //程序停止
}
//等差数列函数
long long calculateSum(long long firstTerm, long long lastTerm, long long n) {
// 计算等差数列的和
long long sum = (firstTerm + lastTerm) * n / 2;
return sum;
}
问题N:字母转换
时间限制: 1 Sec 内存限制: 128 MB
题目描述
将字母的大小写转换一下,非字母字符原样输出。
输入
输入几行字符串
输出
输出转换后的结果
样例输入
I like NOI.
Hello World!
+-*/ are operators.
样例输出
i LIKE noi.
hELLO wORLD!
+-*/ ARE OPERATORS.
代码
#include <iostream> //输入输出流库
#include <string> //字符串库
using namespace std; //命名空间std
//字母转换函数
void swapCase(const std::string& input, std::string& output) {
for (int i = 0; i < input.length(); i++) {
if (isalpha(input[i])) { // 判断是否为字母
output.push_back(toupper(input[i]) == input[i] ? tolower(input[i]) : toupper(input[i])); //判断大小写,进行大小写转换
} else { //非字母可以直接加入string串中
output.push_back(input[i]);
}
}
}
int main() {
string input; //声明一个string类型的input字符串
string output; //声明一个string类型的output字符串
while (getline(cin, input)) { //读取一行字符串,直到没有输入为止
swapCase(input, output); //调用字母转换函数
cout << output << endl; //输出结果
output.clear(); //清空字符串
}
return 0; ///程序结束
}
问题O:计算矩形面积
时间限制: 1 Sec 内存限制: 128 MB
题目描述
两个坐标点能确定一个矩形,请按矩形的面积大小进行排序输出。
输入
每一行给出两个坐标点,表示一个矩形。
不超过100个矩形。
输出
请按要求输出面积。
样例输入
1 2 3 4
1 0 2 3
2 1 3 1
2 8 7 1
样例输出
0
3
4
35
代码
#include <iostream> //输入输出流库
#include <vector> //vector容器库
#include <algorithm> //算法库
using namespace std;//命名空间std
struct Point {
long long x, y;
}; //声明一个结构体,用于坐标点
struct Rectangle {
Point topLeft;
Point bottomRight;
long long area() const {
return (bottomRight.x - topLeft.x) * (topLeft.y - bottomRight.y);
}
}; //声明一个结构体,用来获得矩阵面积
//比较面积大小
bool compareArea(const Rectangle &a, const Rectangle &b) {
return a.area() < b.area();
}
int main() {
vector<Rectangle> rectangles; //声明一个容器类型是结构体Rectangle
long long x1, y1, x2, y2;
// 读取输入
while (cin >> x1 >> y1 >> x2 >> y2) {
Rectangle rect;
rect.topLeft.x = min(x1, x2);
rect.topLeft.y = max(y1, y2);
rect.bottomRight.x = max(x1, x2);
rect.bottomRight.y = min(y1, y2);
rectangles.push_back(rect); //插入到容器中
}
// 按矩形面积排序
sort(rectangles.begin(), rectangles.end(), compareArea);
// 输出排序后的面积
for (const auto &rect : rectangles) {
cout << rect.area() << endl;
}
return 0; //程序结束
}
问题P:对称文
时间限制: 1 Sec 内存限制: 128 MB
题目描述
对称文中字符串以中心为对称。例如,madam是对称文。 字串中的字符是由数字、标点符号、空格以及英文字符(包括大小写)组成。每个字串占一行。英文字符不区分大小写,也就是说,’A’与’a’视同相等。标点符号中“{<([”与“])>}”对称。
输入
每行输入一个字符串
当字串为“000000”时,输入结束。
输出
对称输出Symmetry
反之输出Not symmetry
样例输入
<Madam>
ling 121 gnil
kkghkkhg
)aba(
000000
样例输出
Symmetry
Symmetry
Not symmetry
Not symmetry
代码
#include <iostream> //输入输出流库
#include <string> //string字符串库
using namespace std; //命名空间std
//判断是否对称的函数
bool isSymmetry(string str){
int i = str.size(); //获取字符串的大小
for(int j= 0; j < i/2 ; ++j){ //进行前后判断对称
if(tolower(str[j]) == tolower(str[i-j-1])){ //去除大小写影响
continue;
}
else if( str[j]=='{' && str[i-j-1]=='}'){
continue;
}
else if(str[j]=='<' && str[i-j-1]=='>'){
continue;
}
else if(str[j]=='(' && str[i-j-1]==')'){
continue;
}
else if(str[j]=='[' && str[i-j-1]==']'){
continue;
}
else{
return false;
}
}
return true;
}
int main() { //主程序入口
string str; //声明一个字符串
while(getline(cin,str)){ //读取每行输入
if(str == "000000"){ //循环停止条件
break;
}
else{
if(isSymmetry(str)){ //对称则输出对称
cout << "Symmetry" << endl;
}
else{ //否则输出不对称
cout << "Not symmetry" << endl;
}
str.clear(); //清空字符串,释放空间
}
}
return 0; //程序结束
}
问题Q:判断数字
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入一些字串,判断其是否为数字字串。
数字字串是指子串中不含有任何其他非数字的字符。
提示:gets读入字符串,遇到EOF结束的方法为 while(gets(s)!=NULL)
输入
每行输入一个字串,字串中允许有空格
输出
输出判断结果
样例输入
120D3
012
样例输出
No
Yes
代码
#include <iostream> //输入输出流库
#include <string> //字符串库
using namespace std; //命名空间std
int main() { //主程序入口
string str; //声明一个string类型的变量
bool isNum=true; //声明一个布尔类型的变量用来判断是否是数字
while(getline(cin,str)){ //读取每行
int i = str.size(); //获得每行字符串的大小
if(str.empty()){ //如果行为空则停止
break;
}
else{
for(int j=0; j < i ;++j){ //遍历字符串
if(isdigit(str[j]) ){ //用isdigit函数判断是否是数字
isNum = true;
}
else{
isNum = false;
break;
}
}
if(isNum){ //如果是数字则输出Yes
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
isNum=true; //重置判断标识,以便进行下一次判断
str.clear(); //释放字符串,以便进行下一次字符串存入
}
}
return 0; //程序结束
}
问题R:美丽的数
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有些数总是与众不同,它们认为自己比其它数美丽。数与数之间是怎样比美丽的呢?拥有的质数数字越多,就越美丽!例如333含有3个质数数字(三个3),3563含有3个质数数字(两个3和一个5),而6没有质数数字。如果两个数有相同的质数数字数目,那么小的那个数就比较美丽了,你能帮忙找出最美丽的数吗?
输入
有多组输入数据,每组数据以N开头,表示接下来有N个数。
如果N为0,表示本组没有待比较的数据,但不表示输入结束。
输出
每行对应一个输出,即美丽的数。
样例输入
4 2 3 4 5
3 33 35 3475
0
样例输出
2
3475
代码
#include <iostream> //输入输出流库
#include <string> //字符串函数
#include <vector> //vector容器
#include <cmath> //数学库
using namespace std; //命名空间std
bool isPrime(int num){ //进行单个数字的质数判断
int primes[] = {2,3,5,7};
for(int i=0; i<4;++i){
if(num == primes[i]){
return true;
}
}
return false;
}
//统计一个数包含的质数个数函数
int countPrimeDigits(int n) {
int count = 0;
while (n != 0) { //通过取余数的方法来判断最后一个的数是否是质数
if (isPrime(n % 10))
count++;
n /= 10;
}
return count;
}
// 找到一组数字中的最美丽数字
int findMostBeautifulNumber(vector<int>& numbers) {
if (numbers.empty()) //如果没有数字则直接返回结束
return 0;
int maxPrimeDigits = 0; //记录最多质数的数量
int mostBeautifulNumber = numbers[0]; //记录美丽的数
for (int num : numbers) { //遍历容器
int primeDigits = countPrimeDigits(num); //通过统计质数个数函数
if (primeDigits > maxPrimeDigits) { //比较求得质数个数最大的函数
maxPrimeDigits = primeDigits;
mostBeautifulNumber = num;
} else if (primeDigits == maxPrimeDigits && num < mostBeautifulNumber) { //如果质数数量相同,则更小的数更美丽
mostBeautifulNumber = num;
}
}
return mostBeautifulNumber; //返回最美的数字
}
int main() { //主程序入口
int N; //每行数字数量
while (cin >> N) {
if(N==0){ //当输入为0则停止
break;
}
vector<int> numbers; //声明一个int类型容器存放每行输入的数字
for (int i = 0; i < N; i++) {
int num;
cin >> num;
numbers.push_back(num);
}
int beautifulNumber = findMostBeautifulNumber(numbers); //寻找最美的数
cout << beautifulNumber << endl;
}
return 0; //程序停止
}
问题S:统计数字
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给出一个字符串S(S仅由’0’~’9’组成,且不包含空格,长度≤100),请将其各个数字按个数打印出,并且输出各个数字之和。
输入
第一个行整数N为测试数据组数。接下来N行为S。
输出
如果数字i(0≤i≤9)出现的次数大于0则输出i : Ai (Ai为i出现的次数),并在末尾输出S中各个数字的和,每组输出结束后空一行。(最后一组数据后无空行)。
样例输入
2
0012
13588
样例输出
0:2
1:1
2:1
3
1:1
3:1
5:1
8:2
25
代码
#include <iostream> //输入输出流库
#include <algorithm> //算法库
#include <string> //字符串库
using namespace std; //命名空间std
int main(){ //主程序入口
int N,sizeStr,sum; //声明测试数据组数,字符串大小,各个数字之和
string str; //声明字符串类型
int arr[10]={0}; //声明一个数组来存放每个数字的个数
cin >> N;
getline(cin,str); //排除换行符干扰
for(int i=0; i <N;i++){
getline(cin,str);
sizeStr = str.length();
sum=0;
//统计各个数字的数量,顺便累加
for(int j=0; j <sizeStr;++j){
arr[str[j]-'0']++;
sum+= (str[j]-'0');
}
//输出不等于0的数的个数,从小到大
for(int k=0;k<10;++k){
if(arr[k]!=0){
cout << k << ":" << arr[k] << endl;
}
}
//字符串清空
str.clear();
cout << sum << endl;
cout << endl;
//数字重置
for(int l=0;l<10;++l){
arr[l] = 0;
}
}
}
return 0; //程序结束
问题T:按长度排序
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有一些整数,它的结构是:第一行为一个整数N,表示后面有N个整数需要排序输出,先按长度排,如长度一样则按大小排(从小到大),若遇到N等于零,则运行结束。
输入
第一行为一个整数N,表示后面有N个整数,若遇到N等于零,则运行结束。
整数的长度可达100位,需选用合适的数据类型解决。
输出
输出排序结果
样例输入
3
123
12
3333
2
1000000000000000
1
0
样例输出
12
123
3333
1
1000000000000000
代码
#include <iostream> //输入输出流库
#include <vector> //vector容器库
#include <algorithm> //算法分析库
#include <string> //字符串库
using namespace std; //命名空间std
// 自定义比较函数,按照长度和大小排序
bool compare(const string& a, const string& b) {
if (a.size() != b.size()) {
return a.size() < b.size(); // 长度从小到大排序
} else {
return a < b; // 大小从小到大排序
}
}
int main() { //主程序入口
int N; //整数N,表示后面有N个整数需要排序输出
while (cin >> N && N != 0) {
vector<string> numbers(N);
for (int i = 0; i < N; ++i) {
cin >> numbers[i];
}
// 按照长度和大小排序
sort(numbers.begin(), numbers.end(), compare);
// 输出排序结果
for (const auto& num : numbers) {
cout << num << endl;
}
cout << endl; // 输出结束换行
}
return 0; //程序结束
}