鱼C论坛

 找回密码
 立即注册
查看: 1248|回复: 6

[已解决]递归问题

[复制链接]
发表于 2021-10-27 14:03:00 | 显示全部楼层 |阅读模式

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

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

x
题目是要求输入一个四位数,让里面数字组成最大值和最小值相减,一直循环下去直到结果重复为止。输入1001,最终结果为6174;
这里不知道是不是我的递归方法用得不对,大佬们帮我看下。

  1. #include<stdio.h>

  2. int num[5];
  3. int result(int m) {
  4.         int e, f;   // 存放余数
  5.         int max, min;
  6.         num[0] = m / 1000; // 千位
  7.         e = m % 1000;
  8.         num[1] = e / 100;  // 百位
  9.         f = e % 100;
  10.         num[2] = f / 10;   // 十位
  11.         num[3] = f % 10;   // 个位

  12.         int i, j;

  13.         // 四位数最大值
  14.         for (i = 0; i < 4; i++) {
  15.                 for (j = 0; j < 4 - i - 1; j++) {
  16.                         if (num[j] < num[j + 1]) {
  17.                                 int temp = num[j];
  18.                                 num[j] = num[j + 1];
  19.                                 num[j + 1] = temp;
  20.                         }
  21.                 }
  22.         }
  23.         max = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];

  24.         // 四位数最小值
  25.         for (i = 0; i < 4; i++) {
  26.                 for (j = 0; j < 4 - i - 1; j++) {
  27.                         if (num[j] > num[j + 1]) {
  28.                                 int temp = num[j];
  29.                                 num[j] = num[j + 1];
  30.                                 num[j + 1] = temp;
  31.                         }
  32.                 }
  33.         }
  34.         min = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];

  35.         int cha1 = max - min;   // 求差
  36.         int cha2 = 0;
  37.         if (cha1 != cha2) {   // 不相同递归
  38.                 cha2 = cha1;
  39.                 return result(cha1);
  40.         }
  41.         else {
  42.                 return cha1;
  43.         }
  44. }

  45. int main() {
  46.         int m;
  47.         scanf("%d", &m);
  48.         printf("%d", result(m));
  49.         return 0;
  50. }
复制代码
最佳答案
2021-10-27 15:34:51
本帖最后由 jackz007 于 2021-10-27 15:51 编辑
a327904410 发表于 2021-10-27 14:21
编写一个程序,输入一个4位的正整数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后 ...


        第42行有错误
  1.         if (cha1 != cha2) {   // 不相同递归
复制代码

        改为
  1.         if (cha1 != m) {   // 不相同递归
复制代码

        试试看。
         下面是我写的代码版本,仅供楼主参考
  1. #include <stdio.h>

  2. int foo(int n)
  3. {
  4.         int d[4] = {0} , i , j , k , r = 0 , max , min                    ;
  5.         if(n > 999 && n < 10000) {
  6.                 for(k = n , i = 4 ; i ; k /= 10 , i --) d[i - 1] = k % 10 ;
  7.                 for(i = 0 ; i < 3 ; i ++) {
  8.                         for(j = i + 1 ; j && d[j] < d[j - 1]; j --) {
  9.                                 k = d[j - 1]                              ;
  10.                                 d[j - 1] = d[j]                           ;
  11.                                 d[j] = k                                  ;
  12.                         }
  13.                 }
  14.                 max = d[3] * 1000 + d[2] * 100 + d[1] * 10 + d[0]         ;
  15.                 min = d[0] * 1000 + d[1] * 100 + d[2] * 10 + d[3]         ;
  16.                 if(max - min != n) r = foo(max - min)                     ;
  17.                 else r = max - min                                        ;
  18.         }
  19.         return r                                                          ;
  20. }

  21. int main(void)
  22. {
  23.         int n                   ;
  24.         scanf("%d" , & n)       ;
  25.         printf("%d\n" , foo(n)) ;
  26. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 1001
  4. 6174

  5. D:\0002.Exercise\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-27 14:11:44 | 显示全部楼层
        是么叫 "结果重复",请举例说明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-27 14:21:13 | 显示全部楼层
jackz007 发表于 2021-10-27 14:11
是么叫 "结果重复",请举例说明。

编写一个程序,输入一个4位的正整数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后用最大数减去最小数,得到一个新的正整数(该数一定大于1000)。然后对于这个新的正整数,重复上述步骤,直到该正整数的值不再发生变化。
  例如,假设用户输入的正整数为1001,那么由它所形成的最大数为1100,最小数为11,因此新的正整数为1089。对于1089,由它形成的最大数为9810,最小数为189,因此新的正整数为9621。9621的最大数为9621,最小数为1269,结果为8352,。8352的最大数为8532,最小数为2358,结果为6174。6174的最大数为7641,最小数为1467,结果仍为6174,因此程序结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 15:34:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-10-27 15:51 编辑
a327904410 发表于 2021-10-27 14:21
编写一个程序,输入一个4位的正整数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后 ...


        第42行有错误
  1.         if (cha1 != cha2) {   // 不相同递归
复制代码

        改为
  1.         if (cha1 != m) {   // 不相同递归
复制代码

        试试看。
         下面是我写的代码版本,仅供楼主参考
  1. #include <stdio.h>

  2. int foo(int n)
  3. {
  4.         int d[4] = {0} , i , j , k , r = 0 , max , min                    ;
  5.         if(n > 999 && n < 10000) {
  6.                 for(k = n , i = 4 ; i ; k /= 10 , i --) d[i - 1] = k % 10 ;
  7.                 for(i = 0 ; i < 3 ; i ++) {
  8.                         for(j = i + 1 ; j && d[j] < d[j - 1]; j --) {
  9.                                 k = d[j - 1]                              ;
  10.                                 d[j - 1] = d[j]                           ;
  11.                                 d[j] = k                                  ;
  12.                         }
  13.                 }
  14.                 max = d[3] * 1000 + d[2] * 100 + d[1] * 10 + d[0]         ;
  15.                 min = d[0] * 1000 + d[1] * 100 + d[2] * 10 + d[3]         ;
  16.                 if(max - min != n) r = foo(max - min)                     ;
  17.                 else r = max - min                                        ;
  18.         }
  19.         return r                                                          ;
  20. }

  21. int main(void)
  22. {
  23.         int n                   ;
  24.         scanf("%d" , & n)       ;
  25.         printf("%d\n" , foo(n)) ;
  26. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 1001
  4. 6174

  5. D:\0002.Exercise\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-27 16:12:46 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-27 16:20 编辑
  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. int max(int a, int b, int c, int d){ return (a >= b && a >= c && a >= d) ? a : (b >= a && b >= c && b >= d) ? b : (c >= a && c >= b && c >= d) ? c : d; }

  4. bool kaprekar(int num) // Kaprekar number
  5. {
  6.     int a, b, c, d;
  7.     a = num/1000;
  8.     b = (num%1000)/100;
  9.     c = (num%100)/10;
  10.     d = (num%10);
  11.     return (max(a, b, c, d)*4-(a+b+c+d)) > 1 ? true : false;
  12. }

  13. int main()
  14. {
  15.     int num;
  16.     scanf("%d", &num);
  17.     printf("%d", kaprekar(num) ? 6174 : 0); // 答案必然是 6174 或 0
  18.     return 0;
  19. }
复制代码

卡布列克常数
任意一个不是由完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,
然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数(Kaprekar number)
**条件:4个数字不能有4个相同数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-27 19:14:36 | 显示全部楼层
jackz007 发表于 2021-10-27 15:34
第42行有错误

        改为

确实是42有误,懂了- -前面int个0递归回来还是0,我又傻了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-27 19:17:11 | 显示全部楼层
傻眼貓咪 发表于 2021-10-27 16:12
本帖最后由 傻眼貓咪 于 2021-10-27 16:20 编辑

卡布列克常数

感谢,辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 08:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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