user-0 提问: PTA中有关黑洞数的一个问题

回复:
user: user-0
content: 引用 19 楼 早打大打打核战争的回复:这题可以简单实现：  #include <stdio.h>  int main() {   for (int a, b, c, n = 1, x = 0, y = scanf("%d", &x); ; x -= y)   {     a = x / 100, b = x % 100 / 10, c = x % 10;     if (a > b) b += a -= b, a = b - a;     if (b > c) c += b -= c, b = c - b;     if (a > b) b += a -= b, a = b - a;     x = c * 100 + b * 10 + a, y = a * 100 + b * 10 + c;     printf("%d: %d - %d = %d\n", n++, x, y, x - y);     if (x - y == 495 || !(x - y)) break;   }    return 0; }  我的天啊，大佬你太有才了，为啥我就想不通呢

user: user-1
content: 这题可以简单实现：  #include <stdio.h>  int main() {   for (int a, b, c, n = 1, x = 0, y = scanf("%d", &x); ; x -= y)   {     a = x / 100, b = x % 100 / 10, c = x % 10;     if (a > b) b += a -= b, a = b - a;     if (b > c) c += b -= c, b = c - b;     if (a > b) b += a -= b, a = b - a;     x = c * 100 + b * 10 + a, y = a * 100 + b * 10 + c;     printf("%d: %d - %d = %d\n", n++, x, y, x - y);     if (x - y == 495 || !(x - y)) break;   }    return 0; }

user: user-0
content: 引用 17 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  satic int key_list[] = {495, 6174}; void bubble_asc_sort(int *arr, int size); int get_each_bit(int num, int *arr, int size);  int main() {     int num, max, min, key;     int arr[10], len;     int i, cnt = 0;      scanf("%d", &num);      while (1) {         len = get_each_bit(num, arr, 10);         if (len <= 2 || len > 4) {             printf("No kaprekar!\n");             break;         }         bubble_asc_sort(arr, len);          min = 0;         i = 0;         while (i < len) {             min = min * 10 + arr[i];             i++;         }          max = 0;         i = len-1;         while (i >= 0) {             max = max * 10 + arr[i];             i--;         }          if (max == min) {             printf("No kaprekar!\n");             break;         }         num = max - min;          key = key_list[len - 3];         printf("%d: %d - %d = %d\n", ++cnt, max, min, num);         if (num == key)             break;     }       return 0; }  int get_each_bit(int num, int *arr, int size) {     int i = 0;      while (num && i < size) {         arr[i++] = num % 10;         num /= 10;     }      return i; }  void bubble_asc_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 一起探讨，学习，供参考～ 谢谢大佬，我会再花一个小时来研究的！哎呀，好开心啊

user: user-2
content: #include <stdio.h> #include <stdlib.h>  satic int key_list[] = {495, 6174}; void bubble_asc_sort(int *arr, int size); int get_each_bit(int num, int *arr, int size);  int main() {     int num, max, min, key;     int arr[10], len;     int i, cnt = 0;      scanf("%d", &num);      while (1) {         len = get_each_bit(num, arr, 10);         if (len <= 2 || len > 4) {             printf("No kaprekar!\n");             break;         }         bubble_asc_sort(arr, len);          min = 0;         i = 0;         while (i < len) {             min = min * 10 + arr[i];             i++;         }          max = 0;         i = len-1;         while (i >= 0) {             max = max * 10 + arr[i];             i--;         }          if (max == min) {             printf("No kaprekar!\n");             break;         }         num = max - min;          key = key_list[len - 3];         printf("%d: %d - %d = %d\n", ++cnt, max, min, num);         if (num == key)             break;     }       return 0; }  int get_each_bit(int num, int *arr, int size) {     int i = 0;      while (num && i < size) {         arr[i++] = num % 10;         num /= 10;     }      return i; }  void bubble_asc_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 一起探讨，学习，供参考～

user: user-0
content: 引用 15 楼 wowpH的回复:你之前的帖子都没结，，，你说这话的勇气在哪儿。  CSDN论坛新手指南 大佬啊我今晚上完晚自习回宿舍马上去登录电脑版结贴，我是个有诚信的人，你等着啊

user: user-3
content: 你之前的帖子都没结，，，你说这话的勇气在哪儿。  CSDN论坛新手指南

user: user-0
content: 引用 11 楼 自信男孩的回复:求出每位数字，然后排序，把升序的组成的数减去降序组成的数  #include <stdio.h> #include <stdlib.h>  void bubble_asc_sort(int *arr, int size); int get_each_bit(int num, int *arr, int size); int main() {     int num, max, min;     int arr[10], len;     int i, cnt = 0;      scanf("%d", &num);      while (1) {         len = get_each_bit(num, arr, 10);         bubble_asc_sort(arr, len);          min = 0;         i = 0;         while (i < len) {             min = min * 10 + arr[i];             i++;         }          max = 0;         i = len-1;         while (i >= 0) {             max = max * 10 + arr[i];             i--;         }         num = max - min;         printf("%d: %d - %d = %d\n", ++cnt, max, min, num);         if (num == 495)             break;     }   #if 0     int n,max,min,i,j,k,temp;     int a[3];     scanf("%d",&n);      if(n==495) //强烈注意！一定不能忘记一开始输入495这个情况！不然没法得满分！没错，笔者就是栽在了这里T_T     {         printf("1: 954 - 459 = 495");         return 0;     }      for(i=1;n!=495;i++)     {         a[0]=n/100;         a[1]=n/10%10;         a[2]=n%10;          if(a[0]==a[1]&&a[1]==a[2])         {             printf("%d: %d - %d = 0",i,n,n);             return 0;         }          for(j=0;j<2;j++)         {             for(k=j+1;k<3;k++)             {                 if(a[j]<a[k])//用了一个数组来表示。                 {                     temp=a[j];                     a[j]=a[k];                     a[k]=temp;                 }             }         }          max=a[0]*100+a[1]*10+a[2];         min=a[2]*100+a[1]*10+a[0];         n=max-min;         printf("%d: %d - %d = %d\n",i,max,min,n);     } #endif     return 0; }  int get_each_bit(int num, int *arr, int size) {     int i = 0;      while (num && i < size) {         arr[i++] = num % 10;         num /= 10;     }      return i; }  void bubble_asc_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  供参考～ 大佬又是你啊，你真是个好人，我会花一个小时把它看完，今晚给你结贴，哈哈哈嗝

user: user-0
content: 大佬又是你啊，你真是个好人，我会花一个小时把它看完，今晚给你结贴，哈哈哈嗝

user: user-0
content: 引用 10 楼 wowpH的回复:[quote=引用 9 楼 乔碧萝大魔王 的回复:] [quote=引用 8 楼 wowpH的回复:]就是个排序。  有点奇怪的排序，既不是选择也不是（典型的）冒泡。 那只能说那位大神的想法有点清奇哈哈哈嗝[/quote]想法清奇有什么用，效率还不如冒泡。。。。[/quote] 哦，说的也是，但是他自己想的我就觉得好厉害哦🙄

user: user-2
content: 求出每位数字，然后排序，把升序的组成的数减去降序组成的数  #include <stdio.h> #include <stdlib.h>  void bubble_asc_sort(int *arr, int size); int get_each_bit(int num, int *arr, int size); int main() {     int num, max, min;     int arr[10], len;     int i, cnt = 0;      scanf("%d", &num);      while (1) {         len = get_each_bit(num, arr, 10);         bubble_asc_sort(arr, len);          min = 0;         i = 0;         while (i < len) {             min = min * 10 + arr[i];             i++;         }          max = 0;         i = len-1;         while (i >= 0) {             max = max * 10 + arr[i];             i--;         }         num = max - min;         printf("%d: %d - %d = %d\n", ++cnt, max, min, num);         if (num == 495)             break;     }   #if 0     int n,max,min,i,j,k,temp;     int a[3];     scanf("%d",&n);      if(n==495) //强烈注意！一定不能忘记一开始输入495这个情况！不然没法得满分！没错，笔者就是栽在了这里T_T     {         printf("1: 954 - 459 = 495");         return 0;     }      for(i=1;n!=495;i++)     {         a[0]=n/100;         a[1]=n/10%10;         a[2]=n%10;          if(a[0]==a[1]&&a[1]==a[2])         {             printf("%d: %d - %d = 0",i,n,n);             return 0;         }          for(j=0;j<2;j++)         {             for(k=j+1;k<3;k++)             {                 if(a[j]<a[k])//用了一个数组来表示。                 {                     temp=a[j];                     a[j]=a[k];                     a[k]=temp;                 }             }         }          max=a[0]*100+a[1]*10+a[2];         min=a[2]*100+a[1]*10+a[0];         n=max-min;         printf("%d: %d - %d = %d\n",i,max,min,n);     } #endif     return 0; }  int get_each_bit(int num, int *arr, int size) {     int i = 0;      while (num && i < size) {         arr[i++] = num % 10;         num /= 10;     }      return i; }  void bubble_asc_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  供参考～

user: user-3
content: 引用 9 楼 乔碧萝大魔王 的回复:[quote=引用 8 楼 wowpH的回复:]就是个排序。  有点奇怪的排序，既不是选择也不是（典型的）冒泡。 那只能说那位大神的想法有点清奇哈哈哈嗝[/quote]想法清奇有什么用，效率还不如冒泡。。。。

user: user-0
content: 引用 8 楼 wowpH的回复:就是个排序。  有点奇怪的排序，既不是选择也不是（典型的）冒泡。 那只能说那位大神的想法有点清奇哈哈哈嗝

user: user-3
content: 就是个排序。  有点奇怪的排序，既不是选择也不是（典型的）冒泡。

user: user-0
content: 引用 5 楼 qq_45798109的回复:我觉得他这个排序有点复杂， 他的意思就是：假设i中存的i之后所有数中最大的数，如果不是就交换。 j指向i之后的数 比大小只要和他之后的数比就行，不需要和他自身比 哎呀大神写程序想法都太复杂了吧，瑟瑟发抖，谢谢大佬今晚给你结贴哈 ，我好久不结贴，准备被投诉了哈哈哈哈，其实我是小白

user: user-4
content: 你可以去了解一下排序算法

user: user-4
content: 我觉得他这个排序有点复杂， 他的意思就是：假设i中存的i之后所有数中最大的数，如果不是就交换。 j指向i之后的数 比大小只要和他之后的数比就行，不需要和他自身比

user: user-4
content: 我觉得他这个排序有点复杂， 他的意思就是：假设i中存的i之后所有数中最大的数，如果不是就交换。 j指向i之后的数 比大小只要和他之后的数比就行，不需要和他自身比

user: user-0
content: 引用 1 楼 qq_45798109的回复:比如你输入的123 第一个式子321-123是怎么来的？ 不就是把123三个数组从大到小，然后从小到大排序得来的吗 我也知道它是重组的意思，为啥k，比j多了一，我想知道那两个个for语言的处理步骤。

user: user-0
content: 我也知道它是重组的意思，为啥k，比j多了一，我想知道那两个个for语言的处理步骤。

user: user-4
content: 比如你输入的123 第一个式子321-123是怎么来的？ 不就是把123三个数组从大到小，然后从小到大排序得来的吗