所谓"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("数字不满足要求");
}
}
}
}
运行结果如下:
转载于:https://blog.51cto.com/broncho/1266156