鱼C论坛

 找回密码
 立即注册
查看: 2530|回复: 19

[已解决]调换一个数的俩个数字位置,将该数最大化

[复制链接]
发表于 2021-10-1 02:01:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

调换一个数中的两个数字位置,将该数最大化。
例如:15469 输出95461
         1234 输出 4231
         512 输出 521
  1. #include <stdio.h>

  2. int main()
  3. {   
  4.     long long int n,k;
  5.     int  i=0,j=0, m=0, t=0, b=0, c=0, A[100],B[100];
  6.     scanf("%lld", &n);
  7.     k=n;
  8.     while(n != 0)
  9.     {
  10.         m++;        //  m =数字的位数
  11.         n /= 10;
  12.     }
  13.     for(i = 0; i < m; i++)
  14.     {
  15.         A[i]=k%10;  //A数组中是倒序存入每个数字
  16.         k /= 10;
  17.     }
  18.     n=m;k=0;
  19.     for(i = 0; i < m; i++)
  20.     {
  21.         B[i]=A[n-1];    //B数组是正序存入每个数字
  22.         n--;
  23.     }
  24.     for(b = 0; b < m; b++)
  25.     {
  26.         for(i = 0; i < (m-b); i++)
  27.         {
  28.            if (B[b] < B[i+1])
  29.             {
  30.                 t = B[b];
  31.                 B[b] = B[i+1];      //两个for语句想要实现换位,目前没办法实现
  32.                 B[i+1] = t;
  33.                 c++;
  34.                 break;
  35.             }
  36.         }
  37.     }
  38.     for(i=0; i<m; i++)
  39.     {
  40.         printf("%d", B[i]); //输出B中每个元素
  41.     }
  42.     return 0;
  43. }
复制代码
最佳答案
2021-10-1 10:12:32
本帖最后由 人造人 于 2021-10-1 10:14 编辑

这次可以了
1. 用户输入一个数
2. 把这个数的各个数位提取出来
3. 对提取出来的数位按题目要求交换
4. 把交换后的数位组装成一个新的数
5. 输出这个数
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. static void swap(char *a, char *b) {
  4.     char temp = *a;
  5.     *a = *b; *b = temp;
  6. }

  7. void digits_get(char digits[], size_t *size, uint32_t value) {
  8.     *size = 0;
  9.     do {
  10.         digits[(*size)++] = (value % 10) + '0';
  11.         value /= 10;
  12.     } while(value);
  13.     for(size_t i = 0, j = *size - 1; i < j; ++i, --j) \
  14.         swap(&digits[i], &digits[j]);
  15. }

  16. void digits_set(const char digits[], size_t size, uint32_t *value) {
  17.     *value = 0;
  18.     for(size_t i = 0; i < size; ++i) {
  19.         *value *= 10;
  20.         *value += digits[i] - '0';
  21.     }
  22. }

  23. void digits_swap(char digits[], size_t size) {
  24.     for(size_t i = 0; i < size; ++i) {
  25.         size_t max = i;
  26.         for(size_t j = i + 1; j < size; ++j) {
  27.             if(digits[max] < digits[j]) max = j;
  28.         }
  29.         if(max != i) {
  30.             swap(&digits[i], &digits[max]);
  31.             return;
  32.         }
  33.     }
  34. }

  35. int main(void) {
  36.     char digits[10];
  37.     size_t size;
  38.     uint32_t n;
  39.     scanf("%u", &n);
  40.     digits_get(digits, &size, n);
  41.     digits_swap(digits, size);
  42.     digits_set(digits, size, &n);
  43.     printf("%u\n", n);
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-1 02:01:58 | 显示全部楼层
如果有其他思路,也请各位大神告诉下。谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 06:48:42 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-1 06:50 编辑

例如:15469
先从最高位1和5469对比,把比1大5469的存起来,再对5469取最大与1交换,跳出所有循环;
如果没有比1大的,再从第二位5和469对比,把比5大的69存起来,再对比69取最大与5交换,跳出所有循环;
以此类推直到6和9对比
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 08:50:20 | 显示全部楼层
  1. int main()
  2. {   
  3.         int val=856479,tmp=0,i=0,j=0,flag=0,max=0,count=0;
  4.         char ch[16]={0};
  5.         i=0;
  6.         while(val)
  7.         {
  8.                 ch[i++]=val%10;
  9.                 val=val/10;
  10.         }
  11.         count=i-1;
  12.        
  13.         for (i =count; i >=0; i--)
  14.         {
  15.                 max=i;
  16.                 j = i-1;
  17.                 for ( ;j >=0; j--)
  18.                 {
  19.                         if (ch[j]>ch[max])
  20.                         {
  21.                                 max=j;
  22.                                 flag=1;
  23.                         }
  24.                 }
  25.                 if (flag)
  26.                 {
  27.                         tmp=ch[i];
  28.                         ch[i]=ch[max];
  29.                         ch[max]=tmp;
  30.                         break;
  31.                 }
  32.         }
  33.     val=0;
  34.         for (i = count; i>=0 ; i--)
  35.         {
  36.                 val*=10;
  37.                 val+=ch[i];
  38.         }
  39.         return 0;
  40. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:07:31 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. static void swap(char *a, char *b) {
  4.     char temp = *a;
  5.     *a = *b; *b = temp;
  6. }

  7. void digits_get(char digits[], size_t *size, uint32_t value) {
  8.     *size = 0;
  9.     do {
  10.         digits[(*size)++] = (value % 10) + '0';
  11.         value /= 10;
  12.     } while(value);
  13. }

  14. void digits_set(const char digits[], size_t size, uint32_t *value) {
  15.     *value = 0;
  16.     for(size_t i = 0; i < size; ++i) {
  17.         *value *= 10;
  18.         *value += digits[i] - '0';
  19.     }
  20. }

  21. void digits_sort(char digits[], size_t size) {
  22.     for(size_t i = 0; i < size; ++i) {
  23.         for(size_t j = i + 1; j < size; ++j) {
  24.             if(digits[i] < digits[j])
  25.                 swap(&digits[i], &digits[j]);
  26.         }
  27.     }
  28. }

  29. int main(void) {
  30.     char digits[10];
  31.     size_t size;
  32.     uint32_t n;
  33.     scanf("%u", &n);
  34.     digits_get(digits, &size, n);
  35.     digits_sort(digits, size);
  36.     digits_set(digits, size, &n);
  37.     printf("%u\n", n);
  38.     return 0;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:21:12 | 显示全部楼层
不要把所有东西都塞到 main 函数中呀
main 函数是 主函数
主函数只负责主逻辑
主逻辑是什么?
1. 用户输入一个数
2. 把这个数的各个数位提取出来
3. 对提取出来的数位排序
4. 把排好序的数位组装成一个新的数
5. 输出这个数

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:27:16 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-1 09:29 编辑
人造人 发表于 2021-10-1 09:21
不要把所有东西都塞到 main 函数中呀
main 函数是 主函数
主函数只负责主逻辑


“调换一个数中的两个数字位置,将该数最大化。”只互换一次;
当然也可以先排序,然后按数位对比互换一次,然后再重新按数位输出。
感觉很麻烦

楼主的问题就是按从大到小排序的变种
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:33:07 | 显示全部楼层
jhq999 发表于 2021-10-1 09:27
“调换一个数中的两个数字位置,将该数最大化。”只互换一次;
当然也可以先排序,然后按数位对比互换 ...

“只互换一次” 是什么意思?
看这个例子,没有看出 “只互换一次” 的意思
例如:15469 输出95461
         1234 输出 4231
         512 输出 521
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:40:43 | 显示全部楼层
人造人 发表于 2021-10-1 09:33
“只互换一次” 是什么意思?
看这个例子,没有看出 “只互换一次” 的意思
例如:15469 输出95461


15469 输出95461 如果不是一次应该是96541 ;1和9
1234 输出 4231应该是4321;1和4
512 输出 521;1和2


评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:53:45 | 显示全部楼层
jhq999 发表于 2021-10-1 09:40
15469 输出95461 如果不是一次应该是96541 ;1和9
1234 输出 4231应该是4321;1和4
512 输出 521;1 ...

明白了,感谢指出问题,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:54:16 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. static void swap(char *a, char *b) {
  4.     char temp = *a;
  5.     *a = *b; *b = temp;
  6. }

  7. void digits_get(char digits[], size_t *size, uint32_t value) {
  8.     *size = 0;
  9.     do {
  10.         digits[(*size)++] = (value % 10) + '0';
  11.         value /= 10;
  12.     } while(value);
  13. }

  14. void digits_set(const char digits[], size_t size, uint32_t *value) {
  15.     *value = 0;
  16.     for(int i = size - 1; i >= 0; --i) {
  17.         *value *= 10;
  18.         *value += digits[i] - '0';
  19.     }
  20. }

  21. void digits_change(char digits[], size_t size) {
  22.     size_t max = 0, min = 0;
  23.     for(size_t i = 0; i < size; ++i) {
  24.         if(digits[i] > digits[max]) max = i;
  25.         if(digits[i] < digits[min]) min = i;
  26.     }
  27.     swap(&digits[max], &digits[min]);
  28. }

  29. int main(void) {
  30.     char digits[10];
  31.     size_t size;
  32.     uint32_t n;
  33.     scanf("%u", &n);
  34.     digits_get(digits, &size, n);
  35.     digits_change(digits, size);
  36.     digits_set(digits, size, &n);
  37.     printf("%u\n", n);
  38.     return 0;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:57:37 | 显示全部楼层

这样还是不对,我再研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 10:12:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2021-10-1 10:14 编辑

这次可以了
1. 用户输入一个数
2. 把这个数的各个数位提取出来
3. 对提取出来的数位按题目要求交换
4. 把交换后的数位组装成一个新的数
5. 输出这个数
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. static void swap(char *a, char *b) {
  4.     char temp = *a;
  5.     *a = *b; *b = temp;
  6. }

  7. void digits_get(char digits[], size_t *size, uint32_t value) {
  8.     *size = 0;
  9.     do {
  10.         digits[(*size)++] = (value % 10) + '0';
  11.         value /= 10;
  12.     } while(value);
  13.     for(size_t i = 0, j = *size - 1; i < j; ++i, --j) \
  14.         swap(&digits[i], &digits[j]);
  15. }

  16. void digits_set(const char digits[], size_t size, uint32_t *value) {
  17.     *value = 0;
  18.     for(size_t i = 0; i < size; ++i) {
  19.         *value *= 10;
  20.         *value += digits[i] - '0';
  21.     }
  22. }

  23. void digits_swap(char digits[], size_t size) {
  24.     for(size_t i = 0; i < size; ++i) {
  25.         size_t max = i;
  26.         for(size_t j = i + 1; j < size; ++j) {
  27.             if(digits[max] < digits[j]) max = j;
  28.         }
  29.         if(max != i) {
  30.             swap(&digits[i], &digits[max]);
  31.             return;
  32.         }
  33.     }
  34. }

  35. int main(void) {
  36.     char digits[10];
  37.     size_t size;
  38.     uint32_t n;
  39.     scanf("%u", &n);
  40.     digits_get(digits, &size, n);
  41.     digits_swap(digits, size);
  42.     digits_set(digits, size, &n);
  43.     printf("%u\n", n);
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 10:17:28 | 显示全部楼层
人造人 发表于 2021-10-1 09:57
这样还是不对,我再研究研究


排完序更麻烦,还得记录排序之前的数位,根本不用完全排序,只需要按高数位到底数位的顺序,和它后面对比取最大,如果有比它大的取最大的,互换,退出过程,否则继续直到最后两位结束
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 10:19:38 | 显示全部楼层
jhq999 发表于 2021-10-1 10:17
排完序更麻烦,还得记录排序之前的数位,根本不用完全排序,只需要按高数位到底数位的顺序,和它后面对 ...

嗯,我改好了,你可以看看,应该是没问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 10:49:20 | 显示全部楼层
人造人 发表于 2021-10-1 10:19
嗯,我改好了,你可以看看,应该是没问题了

我看没有问题了,测了3数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-1 23:01:37 | 显示全部楼层
谢谢各位 谢谢!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-2 00:08:14 | 显示全部楼层
人造人 发表于 2021-10-1 10:12
这次可以了
1. 用户输入一个数
2. 把这个数的各个数位提取出来

打扰问下 如果是12222,好像没办法正确输出22221
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-2 09:09:16 | 显示全部楼层
霁清d 发表于 2021-10-2 00:08
打扰问下 如果是12222,好像没办法正确输出22221
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. static void swap(char *a, char *b) {
  4.     char temp = *a;
  5.     *a = *b; *b = temp;
  6. }

  7. void digits_get(char digits[], size_t *size, uint32_t value) {
  8.     *size = 0;
  9.     do {
  10.         digits[(*size)++] = (value % 10) + '0';
  11.         value /= 10;
  12.     } while(value);
  13.     for(size_t i = 0, j = *size - 1; i < j; ++i, --j) \
  14.         swap(&digits[i], &digits[j]);
  15. }

  16. void digits_set(const char digits[], size_t size, uint32_t *value) {
  17.     *value = 0;
  18.     for(size_t i = 0; i < size; ++i) {
  19.         *value *= 10;
  20.         *value += digits[i] - '0';
  21.     }
  22. }

  23. void digits_swap(char digits[], size_t size) {
  24.     for(size_t i = 0; i < size; ++i) {
  25.         size_t max = i;
  26.         for(size_t j = i + 1; j < size; ++j) {
  27.             //if(digits[max] < digits[j]) max = j;
  28.             if(digits[max] <= digits[j]) max = j;
  29.         }
  30.         if(max != i) {
  31.             swap(&digits[i], &digits[max]);
  32.             return;
  33.         }
  34.     }
  35. }

  36. int main(void) {
  37.     char digits[10];
  38.     size_t size;
  39.     uint32_t n;
  40.     scanf("%u", &n);
  41.     digits_get(digits, &size, n);
  42.     digits_swap(digits, size);
  43.     digits_set(digits, size, &n);
  44.     printf("%u\n", n);
  45.     return 0;
  46. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-10-3 15:08:15 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表