问题及分析:
键盘输入一个三位数(至少有两个数码不同),找到对应的“黑洞数”。
“黑洞数”指的是将任意一个三位数的三位数码分别从大到小和从小到大排列,所构成的两个数之差再重复刚才的操作,最终止步于某一个数,该数就是“黑洞数”。
黑洞数又称“陷阱数”,操作也称为“重排求差”。
例:168
第一次重排,得到最大数861和最小数168,相减得到693;
第二次重排,得到最大数963和最小数369,相减得到594;
第三次重排,得到最大数954和最小数459,相减得到495;
第四次重排,得到最大数954和最小数459,相减得到495;
相同的操作最后终止于495,则“黑洞数”为495。
191 | 911-119 | 972-279 | 963-369 | 954-459 |
792 | 693 | 594 | 495 | |
286 | 862-268 | 954-459 | ||
594 | 495 | |||
735 | 753-357 | 963-369 | 954-459 | |
396 | 594 | 495 |
程序代码:
#include<stdio.h>
int main()
{
int w1,w2,w3;
int a,b;
int max,min;
printf("input a:");
scanf("%d",&a);
if(a<100||a>=1000)
printf("input data error");
else
{
if(a%111==0) //检测是否3个数码都相同
{
printf("data error");
return 0;
}
while(1)
{
w1=a%10; //个位数码
w2=a/10%10; //十位数码
w3=a/100; //百位数码
max=w1>w2?w1:w2;
max=max>w3?max:w3; //最大数码
min=w1<w2?w1:w2;
min=min<w3?min:w3; //最小数码
//重排的两数之差,因为中间数相同,减后抵消,这里忽略
b=(max-min)*100+(min-max);
if(a==b)
{
printf("a=%d\n",a);
break;
}
else a=b; //不是“黑洞数”,让a等于刚才两数之差,继续重排,判断。
}
}
return 0;
}
编译结果: