所谓"6174"工程,就是一个四位数,对数字的要求是它的个十百千位上的数字不能完全一样,经过以下n次算数变换总能得到“6174”这样一个结果。记得第一次写的时候真的是花了好大的功夫,经过一些日子的学习,已经好多了,好多当时纠结了很久的问题,今天都以不是问题了!
变化步骤:
⑴将上述的一个四位数进行拆分,分别得到四个数字;
⑵将⑴中的四个数字先组合成一个最大的四位数;
⑶再将⑴中的四个数字组合成一个最小的四位数;
⑷用大的四位数与小的四位数作差,观察结果;
⑸如果⑷中的结果不是“6174”,则继续执行⑴直到出现“6174”
在C#中我们把这样一个程序执行的过程叫做循环体。把这个用 C#语言建立的项目叫做“6174”项目。
下面给出了编程代码:
namespace prj6174version2 { class Program { static void Main(string[] args) { //定义变量count计算循环的次数 int count = 0; //定义变量并初始化为要判断的数字 int num = 1333; if (num%1111!=0) { while (true) { int[] ary = new int[4]; int index = 0; //拆分数字并将拆分的结果放入长度为4的数组中 while (num > 0) { //取余的结果是拆分的第一个数字 int x = num % 10; //将拆分结果放入数组中 ary[index] = x; //整除10是将原来的数降低位数 num = num / 10; index++; } Console.WriteLine("\t"); //利用冒泡排序将上述数组降序排列 for (int i = 0; i < ary.Length - 1; i++) { for (int j = 0; j < ary.Length - 1 - i; j++) { //相邻的数比较大小,如果前面的数小于后面的就交换两数的位置 if (ary[j] < ary[j + 1]) { int temp = ary[j]; ary[j] = ary[j + 1]; ary[j + 1] = temp; } } } //将上述降序序列组合成一个最大数 int max = 0; for (int i = 0; i < ary.Length; i++) { max = max * 10 + ary[i]; } Console.WriteLine(max); //逆序后将降序序列编程升序序列 for (int i = 0; i < ary.Length / 2; i++) { int temp1 = ary[i]; ary[i] = ary[ary.Length - 1 - i]; ary[ary.Length - 1 - i] = temp1; } //将逆序后的序列组合成最小数 int min = 0; for (int i = 0; i < ary.Length; i++) { min = min * 10 + ary[i]; } Console.WriteLine(min); //求最大数与最小数的差值 int result = max - min; //将差值给num以便下一次继续进行 num = result; //如果差值等于6174,那么结束循环。如果不等于就继续循环 if (result == 6174) { break; } count++; //循环次数如果大于10,也认为该数字经过10变换都不能变成6174,我们认为失败 if (count > 10) { Console.WriteLine("失败"); break; } } //求出循环进行的次数 Console.WriteLine(count); } else { Console.WriteLine("数字不满足要求"); } } } }
运行结果如下: