关于#c语言#的问题,如何解决?

fun 函数的功能;将 x 值的十进制表示中各位上的数字进行分解重组,从而得到一个最大数和一个最小数,用最大数减去最小数的差值作为函数返回值。例如,当 x =213465789时,对 x 值各位上的数字分解重组后可得到的最大数是987654321,最小数是123456789,因此最大数减去最小数的差值是864197532。

各位上的数字进行分解,使用取模、整除的方式。参考以下代码,关键部分有注释:

#include <stdio.h>

int fun(int x);
int max(int arr[], int len);
int min(int arr[], int len);

int main(){
    int x;
    printf("请输入一个整数:");
    scanf("%d", &x);
    printf("x=%d\n", x);
    fun(x);
    return 0;
}

int fun(int x){
    int arr[10];
    int i = 0, len;
    // 分解各位数字
    while (x > 0){
        arr[i] = x % 10;
        x /= 10;
        i++;
    }
    len = i;
    int max_num = max(arr, len);
    int min_num = min(arr, len);
    printf("max_num=%d\n", max_num);
    printf("min_num=%d\n", min_num);
    printf("max_num-min_num=%d\n", max_num - min_num);
    return 0;
}

int max(int arr[], int len){
    // 选择排序,降序
    for (int i = 0; i < len; i++){
        for (int j = i + 1; j < len; j++){
            if (arr[i] < arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }

    // 组合各位数字
    int max_num = 0;
    for (int j = 0; j < len; j++){
        max_num = max_num * 10 + arr[j];
    }

    return max_num;
}

int min(int arr[], int len){
    // 选择排序,升序
    for (int i = 0; i < len; i++){
        for (int j = i + 1; j < len; j++){
            if (arr[i] > arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }

    // 组合各位数字
    int min_num = 0;
    for (int j = 0; j < len; j++){
        min_num = min_num * 10 + arr[j];
    }

    return min_num;
}
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7455595
  • 除此之外, 这篇博客: 已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 听王道的老师说,数据结构的学习,对于考研来说,没必要上机自己实操,太花时间了,对此我也深有体会,今天之所以会自己上机跑一下,实在是二叉树这块儿一下20个大题,我自己的方法往往跟课后答案思路很不相同,特别是这个题,我只写了11行代码,翻开课后答案一看,好家伙 满满一页纸,还借助了一个队列。

    自己验算了好几遍,感觉我的方法没问题,但是Jian不自信,加上这节的大题实在变态,大量的花式递归,太搞心态了,抱着找找信心的目的,拿出电脑,敲上代码。

    是骡子是马 拉出来溜溜!

    //借鉴了之前那个博主提到过的思路
    //利用递归  逐级返回子树的结点指针
    BiTree PreOrderDe(BiTree T,ElemType e,int tag){
    	if(T)
    		if(T->data!=e&&tag==0){
    			T->lchild=PreOrderDe(T->lchild,e,0);
    			T->rchild=PreOrderDe(T->rchild,e,0);
    		}else{
    			T->lchild=PreOrderDe(T->lchild,e,1);
    			T->rchild=PreOrderDe(T->rchild,e,1);
    			free(T);
    			T=NULL;
    		}
    		return T;
    
    
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给出如下的函数实现:

    int fun(int x){
        int nums[10] = {0}; // 用于记录各位数字出现的次数,下标对应数字大小,nums[i]表示数字 i 出现的次数
        int maxNum = 0, minNum = 0; // 用于存储最大数和最小数
        int diff = 0; // 用于存储差值
    
        // 将 x 值分解为各位数字,并统计各位数字出现的次数
        while(x){
            int digit = x % 10; // 获取当前位的数字
            nums[digit]++; // 对应数字的计数器加1
            x /= 10; // 将 x 值除以10以继续处理下一位数字
        }
    
        // 按照数字从大到小的顺序组合出最大数和最小数
        for(int i = 9; i >= 0; i--){ // 从数字大到小枚举各种数字
            while(nums[i]--){ // 将当前数字放入最大/最小数中对应的位置
                maxNum = maxNum * 10 + i;
                minNum = minNum * 10 + i;
            }
        }
    
        // 计算差值
        diff = maxNum - minNum;
    
        // 返回差值
        return diff;
    }
    

    调用该函数的方式如下:

    #include <stdio.h>
    
    int main(){
        int x = 213465789;
        int res = fun(x);
        printf("x = %d, diff = %d\n", x, res);
        return 0;
    }
    

    运行结果为:

    x = 213465789, diff = 864197532
    

借鉴楼上的,修改如下,供参考:

#include <stdio.h>
int fun(int x) {
    int nums[10] = { 0 };
    int maxNum = 0, minNum = 0;
    int diff = 0; // 用于存储差值

    while (x) {
        int digit = x % 10;
        nums[digit]++;
        x /= 10;
    }
    x = 1;
    for (int i = 9; i >= 0; i--) {
        while (nums[i]--){
            maxNum = maxNum * 10 + i;
            minNum = i * x + minNum;
            x *= 10;
        }
    }
    diff = maxNum - minNum;// 计算差值
    return diff;// 返回差值
}

int main() {
    int x = 213465789;
    int res = fun(x);
    printf("x = %d, diff = %d\n", x, res);
    return 0;
}