打卡

1.问题:

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。 最后所得的495即为三位黑洞数。 所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。 (6174为四位黑洞数。 )

例如,对三位数207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。 如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程

2.思路:反正题目已经给定了三位数,很容易把三位整数分解为ijk,然后利用5个if-else来判断最大数和最小是:ijk、ikj、jik...。找到最大数和最小数后程序结束。

3.程序流程图:

 

4.代码实现:

#include<stdio.h>
void maxmin( int n , int* min , int* max);

int main(void){
int n ; scanf("%d",&n) ;
int min , max ;
int i = 1 ;
if( n % 111 != 0 ){
do{
maxmin(n, &min , &max ) ;
printf("%d: %d - %d = %d\n",i,max,min,max-min);
n = max - min ;
i++ ;
}while( ( max - min ) != 495) ;
}
return 0 ;
}

//找到最大最小的那个数
void maxmin( int n , int* min , int* max)
{
int NUMBER = 3 ;
int a[NUMBER] ;
for( int i = 0 ; i < NUMBER ; i++ ){
a[i] = n % 10 ;
n = n / 10 ;
}
//冒泡排序
int toolman ;
for( int i = 0 ; i < NUMBER - 1; i++){
for( int j = 0 ; j < NUMBER - 1 - i ; j++){
if( a[j] > a[j+1]){
toolman = a[j] ;
a[j] = a[j+1] ;
a[j+1] = toolman ;
}
}
}
*max = *min = 0 ;
for( int i = 0 ; i < NUMBER ;i++){
*min = *min * 10 + a[i] ;
*max = *max * 10 + a[NUMBER-1- i] ;
}

}

posted @ 2023-05-22 00:15  £剑影メ随见彡  阅读(19)  评论(0)    收藏  举报