CPP008混合比较Ex (Nerfed)

该代码示例展示了如何处理含有不同进制整数的字符串,通过将字符串分离、进制转换和冒泡排序,最终按十进制从小到大输出。主要涉及字符串处理、二维数组的运用以及冒泡排序算法。
摘要由CSDN通过智能技术生成

描述

给出若干互不相等的十进制、八进制、十六进制、二进制整数,请将它们排序并从小到大输出

注意输出时不需要保留整数在输入中的进制,只需要按正常十进制格式输出

其中不同进制给出的格式如下:

• 十进制数:不包含前缀,例如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];
    }
}

有一说一,我们也可以通过循环将小字符串输出以后直接便成整数存储到数组中,这种方法也是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值