一个四位数的魔法数字。
描述:
第一步:一个四位数拆分每一位,成四个数字;
第二步: 用第一步拆分的四个数子组成一个最大四位数和一个最小四位数;
第三步:用第二步中的最大数减去最小数,之差等于6174则第一步原始四位数是魔法数字;否则将差进行第一步操作,依次循环,当循环15次之后不再循环。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/*
* 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。
不过这是人为的干扰得出这样的判断,如果通过计算机来运算,我们只能给运算次数添加一个阀值,不然只有进入死循环了。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1259079,如需转载请自行联系原作者