例如输入:35287,输出87523 提示:对输入的五位数分解出每一位,放在一个数组中,然后按降序排序,排好后,再组合成一个5位数输出。

从键盘上输入一个五位数,对该数的五个数字进行从大到小排序,形成一个新的五位数输出。例如输入:35287,输出87523
提示:对输入的五位数分解出每一位,放在一个数组中,然后按降序排序,排好后,再组合成一个5位数输出。

87523 还是 87532?

img

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int num, digits[5];
    cout << "请输入一个五位数:";
    cin >> num;
    for (int i = 0; i < 5; i++) {
        digits[i] = num % 10;
        num /= 10;
    }
    sort(digits, digits + 5, greater<int>());
    int new_num = digits[0] * 10000 + digits[1] * 1000 + digits[2] * 100 + digits[3] * 10 + digits[4];
    cout << "排序后的数字为:" << new_num << endl;
    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7455145
  • 这篇博客你也可以参考下:给一个不多于5位的正整数,要求: ①求出它是几位数②分别输出每一位数③按逆序输出各位数字,例如原数为123,应输出321
  • 除此之外, 这篇博客: 结构体使用方法大全(定义,内存大小,初始化,结构数组,结构指针,位域,结构和联合体的嵌套,结构体包含函数指针)中的 五、结构指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址。如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员。

    那么,这个指针变量定义成什么类型呢?只能定义成结构体类型,且指向什么结构体类型的结构体变量,就要定义成什么样的结构体类型。比如指向 struct STUDENT 类型的结构体变量,那么指针变量就一定要定义成 struct STUDENT* 类型。

    下面将前面的程序用指针的方式修改一下:

    # include <stdio.h>
    # include <string.h>
    struct AGE
    {
        int year;
        int month;
        int day;
    };
    struct STUDENT
    {
        char name[20];  //姓名
        int num;  //学号
        struct AGE birthday;  //生日
        float score;  //分数
    };
    int main(void)
    {
        struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
        struct STUDENT *p = NULL;  /*定义一个指向struct STUDENT结构体类型的指针变量p*/
        p = &student1;  /*p指向结构体变量student1的首地址, 即第一个成员的地址*/
        strcpy((*p).name, "小明");  //(*p).name等价于student1.name
        (*p).birthday.year = 1989;
        (*p).birthday.month = 3;
        (*p).birthday.day = 29;
        (*p).num = 1207041;
        (*p).score = 100;
        printf("name : %s\n", (*p).name);  //(*p).name不能写成p
        printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day);
        printf("num : %d\n", (*p).num);
        printf("score : %.1f\n", (*p).score);
        return 0;
    }
    

    输出结果是:
    name : 小明
    birthday : 1989-3-29
    num : 1207041
    score : 100.0

    我们看到,用指针引用结构体变量成员的方式是:

    (*指针变量名).成员名

    注意,p 两边的括号不可省略,因为成员运算符“.”的优先级高于指针运算符“”,所以如果 *p 两边的括号省略的话,那么 *p.num 就等价于 *(p.num) 了。

    从该程序也可以看出:因为指针变量 p 指向的是结构体变量 student1 第一个成员的地址,即字符数组 name 的首地址,*所以 p 和 (p).name 是等价的

    但是,“等价”仅仅是说它们表示的是同一个内存单元的地址,但它们的类型是不同的。指针变量 p 是 struct STUDENT* 型的,而 (p).name 是 char 型的。所以在 strcpy 中不能将 (*p).name 改成 p。用 %s 进行输入或输出时,输入参数或输出参数也只能写成 (*p).name 而不能写成 p。

    同样,虽然 &student1 和 student1.name 表示的是同一个内存单元的地址,但它们的类型是不同的。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,所以在对 p 进行初始化时,“p=&student1;”不能写成“p=student1.name”。因为 p 是 struct STUDENT* 型的,所以不能将 char* 型的 student1.name 赋给 p。

    此外为了使用的方便和直观,用指针引用结构体变量成员的方式:(*指针变量名).成员名

    可以直接用:指针变量名->成员名来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。

    下面再将程序用“->”修改一下:

    # include <stdio.h>
    # include <string.h>
    struct AGE
    {
        int year;
        int month;
        int day;
    };
    struct STUDENT
    {
        char name[20];  //姓名
        int num;  //学号
        struct AGE birthday;  /*用struct AGE结构体类型定义结构体变量birthday, 生日*/
        float score;  //分数
    };
    int main(void)
    {
        struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
        struct STUDENT *p = NULL;  /*定义struct STUDENT结构体类型的指针变量p*/
        p = &student1;  /*p指向结构体变量student1的首地址, 即第一项的地址*/
        strcpy(p->name, "小明");
        p->birthday.year = 1989;
        p->birthday.month = 3;
        p->birthday.day = 29;
        p->num = 1207041;
        p->score = 100;
        printf("name : %s\n", p->name);  //p->name不能写成p
        printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day);
        printf("num : %d\n", p->num);
        printf("score : %.1f\n", p->score);
        return 0;
    }
    

    输出结果是:
    name : 小明
    birthday : 1989-3-29
    num : 1207041
    score : 100.0

    但是要注意的是,只有“指针变量名”后面才能加“->”,千万不要在成员名如 birthday 后面加“->”。
    综上所述,以下 3 种形式是等价的:

    • 结构体变量.成员名。
    • (*指针变量).成员名。
    • 指针变量->成员名。

    其中第 3 种方式很重要,通常都是使用这种方式,另外两种方式用得不多。后面讲链表的时候用的也都是第 3 种方式。

  • 您还可以看一下 张先凤老师的《计算机体系结构——软件篇5》之 图形图像、数据库、计算机信息安全、软件工程课程中的 图形、图像输入设备小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:
    #include <stdio.h>
    
    int main() {
        int num, arr[5], i, j, temp;
        scanf("%d", &num);
        // 将数字按位存储到数组中
        for (i=0; i<5; i++) {
            arr[i] = num % 10;
            num /= 10;
        }
        // 冒泡排序将数字从大到小排序
        for (i=0; i<4; i++) {
            for (j=0; j<4-i; j++) {
                if (arr[j] < arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        // 根据排序后的数字重新生成新的数字
        int new_num = 0;
        for (i=0; i<5; i++) {
            new_num = new_num * 10 + arr[i];
        }
        printf("%d", new_num);
        return 0;
    }