a327904410 发表于 2021-10-27 14:03:00

递归问题

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

#include<stdio.h>

int num;
int result(int m) {
        int e, f;   // 存放余数
        int max, min;
        num = m / 1000; // 千位
        e = m % 1000;
        num = e / 100;// 百位
        f = e % 100;
        num = f / 10;   // 十位
        num = f % 10;   // 个位

        int i, j;

        // 四位数最大值
        for (i = 0; i < 4; i++) {
                for (j = 0; j < 4 - i - 1; j++) {
                        if (num < num) {
                                int temp = num;
                                num = num;
                                num = temp;
                        }
                }
        }
        max = num * 1000 + num * 100 + num * 10 + num;

        // 四位数最小值
        for (i = 0; i < 4; i++) {
                for (j = 0; j < 4 - i - 1; j++) {
                        if (num > num) {
                                int temp = num;
                                num = num;
                                num = temp;
                        }
                }
        }
        min = num * 1000 + num * 100 + num * 10 + num;

        int cha1 = max - min;   // 求差
        int cha2 = 0;
        if (cha1 != cha2) {   // 不相同递归
                cha2 = cha1;
                return result(cha1);
        }
        else {
                return cha1;
        }
}

int main() {
        int m;
        scanf("%d", &m);
        printf("%d", result(m));
        return 0;
}

jackz007 发表于 2021-10-27 14:11:44

      是么叫 "结果重复",请举例说明。

a327904410 发表于 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,因此程序结束。

jackz007 发表于 2021-10-27 15:34:51

本帖最后由 jackz007 于 2021-10-27 15:51 编辑

a327904410 发表于 2021-10-27 14:21
编写一个程序,输入一个4位的正整数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后 ...

      第42行有错误
      if (cha1 != cha2) {   // 不相同递归
      改为
      if (cha1 != m) {   // 不相同递归
      试试看。
         下面是我写的代码版本,仅供楼主参考
#include <stdio.h>

int foo(int n)
{
      int d = {0} , i , j , k , r = 0 , max , min                  ;
      if(n > 999 && n < 10000) {
                for(k = n , i = 4 ; i ; k /= 10 , i --) d = k % 10 ;
                for(i = 0 ; i < 3 ; i ++) {
                        for(j = i + 1 ; j && d < d; j --) {
                              k = d                              ;
                              d = d                           ;
                              d = k                                  ;
                        }
                }
                max = d * 1000 + d * 100 + d * 10 + d         ;
                min = d * 1000 + d * 100 + d * 10 + d         ;
                if(max - min != n) r = foo(max - min)                     ;
                else r = max - min                                        ;
      }
      return r                                                          ;
}

int main(void)
{
      int n                   ;
      scanf("%d" , & n)       ;
      printf("%d\n" , foo(n)) ;
}
      编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
1001
6174

D:\0002.Exercise\C>

傻眼貓咪 发表于 2021-10-27 16:12:46

本帖最后由 傻眼貓咪 于 2021-10-27 16:20 编辑

#include <stdio.h>
#include <stdbool.h>

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; }

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

int main()
{
    int num;
    scanf("%d", &num);
    printf("%d", kaprekar(num) ? 6174 : 0); // 答案必然是 6174 或 0
    return 0;
}
卡布列克常数
任意一个不是由完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,
然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数(Kaprekar number)。
**条件:4个数字不能有4个相同数字

a327904410 发表于 2021-10-27 19:14:36

jackz007 发表于 2021-10-27 15:34
第42行有错误

      改为


确实是42有误,懂了- -前面int个0递归回来还是0,我又傻了

a327904410 发表于 2021-10-27 19:17:11

傻眼貓咪 发表于 2021-10-27 16:12
本帖最后由 傻眼貓咪 于 2021-10-27 16:20 编辑

卡布列克常数


感谢,辛苦了{:10_298:}
页: [1]
查看完整版本: 递归问题