一个四位数的魔法数字。
描述:
第一步:一个四位数拆分每一位,成四个数字;
第二步: 用第一步拆分的四个数子组成一个最大四位数和一个最小四位数;
第三步:用第二步中的最大数减去最小数,之差等于6174则第一步原始四位数是魔法数字;否则将差进行第一步操作,依次循环,当循环15次之后不再循环。
代码:
/* * Created by SharpDevelop. * User: Ajax * Date: 2013/7/27 星期六 * Time: 23:41 * * 下面代码是用来判断一个四位数是否满足数学上的6174特性数字 */using System;namespace Demo2{ class Program { public static void Main(string[] args) { //检测通过的数字有{5643,5140} //检测未通过的数字有{1111,9999} int startNumber=5643; int initNumber = startNumber; int[] number = new int[4]; int maxNumber = 0; int minNumber = 0; //count用来统计循环的次数,为了保证不出现死循环 int count=15; int tempCount=count; //因为count次有可能并不能检测出来数子是6174数字, //所以用来表示如果是进行了count次跳出循环的打印输出"进行count检测仍然不能判断是6174数字" bool flag=true; do { tempCount--; if(tempCount<0){ flag=false; break; } //每次进入循环体,这两个值回到初始值 maxNumber = 0; minNumber = 0; int index = 0; int initNumberTemp=initNumber; while (initNumberTemp > 0) { int temp = initNumberTemp % 10; initNumberTemp /= 10; number[index] = temp; Console.Write(number[index]+" "); index++; } Console.WriteLine(); Console.WriteLine("第一步:拆分数字="+initNumber+"=完成"); //将数组中的数字从大到小排序(效率较低的冒泡排序) for (int i = 0; i < number.Length-1; i++) { for (int j = i+1; j < number.Length; j++) { if (number[i] < number[j]) { int temp = number[i]; number[i] = number[j]; number[j] = temp; } } } //打印输出从大到小排序后的数字顺序 Console.Write("第二步:打印从大到小排序的数字顺序"); for (int j = 0; j < number.Length; j++) { Console.Write(number[j]+" "); } Console.WriteLine(); //合并排序后的最大数字 Console.Write("第三步:排序后的最大数字值"); for (int i = 0; i < number.Length; i++) { maxNumber = maxNumber * 10 + number[i]; } Console.WriteLine(maxNumber); //将数组中的数字从小到大排序(本质是交换,依赖上面第二步的排序) for (int i = 0; i < number.Length / 2; i++) { int temp = number[i]; number[i] = number[number.Length - 1 - i]; number[number.Length - 1 - i] = temp; } //打印输出从小到大排序后的数字顺序 Console.Write("第四步:打印从小到大排序的数字顺序"); for (int j = 0; j < number.Length; j++) { Console.Write(number[j]+" "); } Console.WriteLine(); //合并排序后的最小数字 Console.Write("第五步:排序后的最小数字值"); for (int i = 0; i < number.Length; i++) { minNumber = minNumber * 10 + number[i]; } Console.WriteLine(minNumber); }while((initNumber=maxNumber-minNumber)!=6174); //结果判断,进行结论输出 if(flag) { Console.WriteLine("{0}是6174数字",startNumber); }else{ Console.WriteLine("进行{0}检测仍然不能判断{1}是6174数字",count,startNumber); } Console.ReadKey(); } }}
运行结果图:
事实上如果四位数的每一位的数字都一样是无法构成魔法特性数字。因为其构成的最大数和最小数之差永远等于0。
不过这是人为的干扰得出这样的判断,如果通过计算机来运算,我们只能给运算次数添加一个阀值,不然只有进入死循环了。