水仙花数问题

仙花数是指一个 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     }

 

posted @ 2013-05-22 22:24  沐松  阅读(1456)  评论(2)    收藏  举报