练习题链接: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 }