练习题链接:http://student.csdn.net/mcs/programming_challenges

  给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。 输入格式: 多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头

 

  今天一个小学弟问我这道题怎么做,我直接回答他将数字全排列,验证是否可被8整除,例如123的全排列:123、231、312、213、132、321   (共3!=6种)

  他听我讲后,问怎么做全排列,然后我上网找个了方法复制粘贴给他(这个,呵呵,这种方法网上肯定可以找到),他就屁颠屁颠的不理我了。全排列方法是验证一个开发者能力最简单有效的方法。

 


 

  以下为提供全排列处理此问题的方法,当然这种方法网上随处可见:

 1 class Program
 2     {
 3         static int Count = 1;
 4         static int DivNum = 8;
 5 
 6         /*
 7          * 
 8          *  1,2:  {1,2},{2,1}
 9          *  1,2,3:   
10          *       {3,1,2},{1,3,2},{1,2,3}     ( {1,2}中随机插入3 )
11          *       {3,2,1},{2,3,1},{2,1,3}     ( {2,1}中随机插入3 )
12          * 
13          * 1,2,3,4:
14          *      就是在上面的六组数字中随机插入4
15          * 
16          * 依次类推
17          */
18 
19         static void Main(string[] args)
20         {
21             string[] arr = new string[]
22             {
23              "11223344",
24              "23456798",
25              "89289238",
26              "23458203945829345"
27             };
28 
29             foreach (string item in arr)
30             {
31                 if (Perm(item.ToCharArray(), 0))
32                     Console.WriteLine("  {0}   Yes", item);
33                 else
34                     Console.WriteLine("  {0}   No", item);
35             }
36         }
37 
38         static void Swap(ref Char lc,ref Char rc)
39         {
40             Char tmp = lc;
41             lc = rc;
42             rc = tmp;
43         }
44 
45         static bool Perm(char[] arrChar, int cur)
46         {
47             if (cur == arrChar.Length - 1)
48             {
49                 long val1 = 0;
50 
51                 if (long.TryParse(new string(arrChar), out val1) && val1 % DivNum == 0)
52                 {
53                     return true;
54                 }
55                 else
56                     return false;
57             }
58             else
59             {
60                 for (int i = cur; i < arrChar.Length; i++)
61                 {
62                     Swap(ref arrChar[cur], ref arrChar[i]);
63                     if (Perm(arrChar, cur + 1))
64                         return true;
65                     Swap(ref arrChar[cur], ref  arrChar[i]);
66                 }
67             }
68             return false;
69         }
70     }
C# 完全排列

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-19
  • 2022-12-23
  • 2021-10-29
  • 2021-05-29
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-18
  • 2022-12-23
  • 2022-01-29
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案