水仙花数问题
仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
这个题,恩咋一看很简单,但是考虑到 N 不固定就蛋疼。
我的主要思路 比如说 153 ,递归枚举 三位数 1 3 5,然后 对 1^3 ,3^3 ,5^3 (我提前处理了0-9的N次幂 )三者 加和 处理 得到 153,然后判断 153 包含的元素 和 135 是否相同,
如果相同 就是水仙花数。(其中我在递归里 加入了剪枝,防止其重复数据,例如 135 和153 就是 重复了,其中包含1个1,1个3,1个5 →_→ 这段代码 写了一晚上 好累)
下面是 我的代码:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 // var watch = new Stopwatch(); 7 // watch.Start(); 8 MakeNum0_9(); 9 // Console.WriteLine(watch.Elapsed); 10 var data=new int[n]; 11 ///获取N位 不重读 数字 例如 135 153 351 315 513 就是重复数字 12 new Program().GetNums(n, 0, ref data); 13 14 GetWFNum(ref reslut); 15 16 } 17 18 static int n = 4; ///水仙花 位数 n最大为10 修改这里 19 20 static List<int[]> reslut=new List<int[]>(); 21 22 static Dictionary<int, int> dic = new Dictionary<int, int>(10); 23 24 public void GetNums(int n,int m,ref int[] data) 25 { 26 27 if (n==m) 28 { 29 var newintarray=new int[n]; 30 data.CopyTo(newintarray,0); 31 reslut.Add(newintarray); 32 return; 33 } 34 else 35 { 36 for (int i = data[m-1>0?m-1:0]; i < 10; i++) 37 { 38 data[m] = i; 39 GetNums(n, m + 1, ref data); 40 } 41 } 42 43 } 44 45 46 /// <summary> 47 /// 判断2者 是否相同元素 48 /// </summary> 49 /// <param name="data"></param> 50 /// <param name="sum"></param> 51 /// <returns></returns> 52 public static int IsWFNum(int[] data,int sum) 53 { 54 55 int[] temparray=new int[n]; 56 int temp=0; 57 int tempsum = sum; 58 string s=""; 59 for (int i = 0; i < n; i++) 60 { 61 s += "0"; 62 } 63 s=sum.ToString(s); 64 for (int i = 0; i < n; i++) 65 { 66 temparray[i] = int.Parse(s[i].ToString()); 67 } 68 temparray = temparray.OrderBy(x => x).ToArray(); 69 bool flag = true; 70 for (int i = 0; i < temparray.Length; i++) 71 { 72 if (!temparray[i].Equals(data[i])) 73 { 74 flag = false; 75 break; 76 } 77 //Console.WriteLine(temparray[i] + " " + data[i]); 78 } 79 if (flag) 80 { 81 return tempsum; 82 } 83 return 0; 84 } 85 86 87 public static void GetWFNum(ref List<int[]> data) 88 { 89 foreach (var item in data) 90 { 91 var sum = 0; 92 foreach (var i in item) 93 { 94 sum += dic[i]; 95 } 96 var temp = IsWFNum(item, sum); 97 if (temp!=0 && temp.ToString().Length==n) 98 { 99 Console.WriteLine(temp); 100 } 101 } 102 } 103 104 /// <summary> 105 /// 制造 0-9的 N次幂 106 /// </summary> 107 public static void MakeNum0_9() 108 { 109 for (int i = 0; i < 10; i++) 110 { 111 int temp = 1; 112 for (int j = 0; j < n; j++) 113 { 114 temp *= i; 115 } 116 dic.Add(i, temp); 117 } 118 } 119 120 121 }

浙公网安备 33010602011771号