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;
}
听王道的老师说,数据结构的学习,对于考研来说,没必要上机自己实操,太花时间了,对此我也深有体会,今天之所以会自己上机跑一下,实在是二叉树这块儿一下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;
我可以给出如下的函数实现:
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;
}