描述
给出若干互不相等的十进制、八进制、十六进制、二进制整数,请将它们排序并从小到大输出
注意输出时不需要保留整数在输入中的进制,只需要按正常十进制格式输出
其中不同进制给出的格式如下:
• 十进制数:不包含前缀,例如1919,810
• 八进制数:前缀为单个0,例如0114,0514
• 十六进制数:前缀为0x,字母为小写英文字母,例如0x1f1e33,0x66ccff
• 二进制数:前缀为0b, 例如0b10,0b101010101
所有整数的数值部分均不包含前导零(即不会有0x00d或0001这种输入的出现)
输入
输入为一行字符串,包含若干按题目描述格式给出的整数 aa (1≤a≤108)(1≤a≤108)
整数间以逗号隔开,保证整数互不相等,整数个数 nn 满足 1≤n≤1001≤n≤100
输出
输出一行,将输入的整数排序并从小到大输出,各个数间以逗号隔开
不需要保留整数在输入中的进制,只需要按正常十进制格式输出
输入样例 1
0b11,0b101,0x1,0x2,6,04,0b1001,0b1000,0x7,0xa
输出样例 1
1,2,3,4,5,6,7,8,9,10
提示
如果你遇到了任何不会的知识点,请务必活用搜索引擎
对于排序操作,在本题你可以使用简单的选择排序、冒泡排序,或者使用stdlib.h中的qsort函数
本题主要考查进制转换与排序,另外考查了构思能力。当我们看到这道题时肯定会想到将不同的字符串从主字符串中分离出来进行进制转换。其实进制转换和排序相对来说都不是很难上手都是很好的。主要的问题是如何把一个个字符出从原来的字符剖离出来。但对于主字符串中很多的小字符串,我们没办法一直设置数组来接收。没办法吗?
办法是肯定有的,思考一下这样的场景,我们把每一个小字符串单独的分离出来,然后每一个小字符串开头换行,那么小字符串就独立了起来,我们的思路也就明朗了起来——我们需要一个二维数组。
理解到这一步后我们的操作就明确很多了。
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int main()
{
char sumstr[10000]; //主字符串
char str[100][100] = {0}; //用来接收小字符串的二维数组
int st[100] = {0}; //字符串化成的整数类型用来输出
cin >> sumstr; //输入主字符串
//用t和k控制二维数组,用i控制主字符串。当num不为‘,’时候,将num的值一一对应到Cvalue里面
//当num为‘,’时,t加一,相当于跳入第二行
int t = 0;
for (int i = 0; i < strlen(sumstr); i++)
{
int k = 0;
while (sumstr[i] != ',')
{
str[t][k++] = sumstr[i++]; //一边执行赋值一边++实现遍历
}
t++; //换行
}
//将ix定义放到for作用域外就代表了有几个小字符串
for (int i = 0; i < t; i++)
{
int len = strlen(str[i]);
switch (str[i][0])
{
case '0':
switch (str[i][1])
{
case 'x':
for (int j = 2; j < len; j++)
{
int temp;
if (str[i][j] >= 'a' && str[i][j] <= 'z')
{
temp = str[i][j] - 'a' + 10;
}
else
{
temp = str[i][j] - '0';
}
st[i] = st[i] * 16 + temp;
}
break;
case 'b':
for (int j = 2; j < len; j++)
{
st[i] = st[i] * 2 + str[i][j] - '0';
}
break;
default:
for (int j = 1; j < len; j++)
{
st[i] = st[i] * 8 + str[i][j] - '0';
}
}
break;
default:
for (int j = 0; j < len; j++)
{
st[i] = st[i] * 10 + str[i][j] - '0';
}
break;
}
}
//以上完成进制转换,下面进行排序,这里使用冒泡排序
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t - i - 1; j++)
{
if (st[j] > st[j + 1])
{
int tei;
tei = st[j];
st[j] = st[j + 1];
st[j + 1] = tei;
}
}
}
//输出
for (int i = 0; i < t; i++)
{
if (i > 0)
{
cout << ',';
}
cout << st[i];
}
}
有一说一,我们也可以通过循环将小字符串输出以后直接便成整数存储到数组中,这种方法也是可以的。