题目描述
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
- 第1次重排求差得:720 - 27 = 693;
- 第2次重排求差得:963 - 369 = 594;
- 第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
样例输入
123
样例输出
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
算法分布解析
第一步
#include<stdio.h>
int main(){
}
显而易见,学过c语言的就不必我多说了
第二步
int num,b,c,d,max,min,n,i=0;//
1:num为输入的三位数,b ,c ,d分别对应num的个位 十位 百位
2:后续需要改变num各位的位置需要引入n作为中间交换量
3:max,min 则为后续改成的最大值和最小值
4:i为输出时计算的序号
scanf("%d",&num);//输入一个三位数
b=num/100;d=num%10;
c=(num/10)%10;
第三步
因为需要不断的进行条件判断所以可以使用do-while循环进行程序的实现
do
{
b=num/100;d=num%10;
c=(num/10)%10;
while(b<c||c<d)
{
if(b>c) ;
else { n=b;b=c;c=n; }
if(c>d) ;
else{ n=c;c=d;d=n; }
}
算法分析:
1:首先将b , c ,d作为num中的个位,十位,百位。
2:while循环条件为百位大于十位和十位大于个位满足其中之一。
if和while结构讲解 注:{一旦进入了循环就一定满足其中一个if结构}
分为了三种情况
1:第一个if结构不满足运行else,b与c的值进行互换,第二个if结构也不满足运行else,c与d的值进行互换
2:满足第一个if结构不满足第二个。
3:满足第二个if结构不满足第二个。
第四步
i++;//运行的次数
e=b*100+c*10+d;
f=d*100+c*10+b;
anum=e-f;//差值
printf("%d: %d - %d = %d\n",i,e,f,num);
}
解释:i++语句进行运行次数的记录以便输出时前面的序号。
第五步
while(num!=495&&num!=0);//判断条件
return 0;}
进行判断while循环结束最后的程序
全部程序代码
#include<stdio.h>
int main()
{
int num,b,c,d,e,f,n,i=0;
scanf("%d",&num);//输入一个三位数
do//由于至少运行一次,故用do while
{
b=num/100;d=num%10;
c=(num/10)%10;//将各位上数分开
while(b<c||c<d)//冒泡排序按由大到小的顺序排出
{
if(b>c) ;
else { n=b;b=c;c=n; }
if(c>d) ;
else{ n=c;c=d;d=n; }
}
i++;//运行的次数
e=b*100+c*10+d;
f=d*100+c*10+b;
num=e-f;//差值
printf("%d: %d - %d = %d\n",i,e,f,num);
}
while(num!=495&&num!=0);//判断条件
return 0;}