摘要:有这样一个猜想:给定一个四位数,abcd找出abcd组合成的最大数和最小数,然后相减,然后得到一个新的四位数,重复该过程,不超过8次即可得到一个固定的数6174;现在用c语言进行验证;
(1)首先需要构建的函数是找到一个四位数最大或者最小的组合;对于任意四位数,利用取余数求出每个位,然后利用桶式排序得到一个排序的序列,顺序或倒序求出形成的四位数.
int FindMax(int Number)
{
int S[4] = {0};
int Order[10] = {0};
for (int i = 0;i<=3;i++)
{
S[i] = Number%10;
Order[S[i]]++;
Number /= 10;
}
Number = 0;
for(int i =9;i>=0;i--)
{
if(Order[i]!=0)
{
while(Order[i]--)
Number = 10*Number +i;//从小到大
}
}
return Number;
}
int FindMin(int Number)
{
int S[4] = {0};
int Order[10] = {0};
for (int i = 0;i<=3;i++)
{
S[i] = Number%10;
Order[S[i]]++;
Number /= 10;
}
Number = 0;
for(int i =0;i<=9;i++)
{
if(Order[i]!=0)
{
while(Order[i]--)
Number = 10*Number +i;//从小到大
}
}
return Number;
}
(2)对于每个四位数进行验证,利用递归的思路,并且传递变量times(规定次数内求解出)限制边界条件可以得到结果.
void Check(int Number,int times)
{
int Max = FindMax(Number);
int Min = FindMin(Number);
int OldNumber = Max - Min;
if (Number == OldNumber && times<=8)
printf("\nthe Number %d is okay,times is %d",Number,times);
else if (times < 8)
Check(OldNumber,times+1);
else
printf("\nthe Number: %d failed",Number);
}
int _tmain(int argc, _TCHAR* argv[])
{
int number ;
for (number = 1000;number<=9999;number++)
Check(number,1);
return 0;
}