其實會寫這支程式是因為 Allen Kuo 大在 BS 上發出的一個問題...
其實會寫這支程式是因為 Allen Kuo 大在 BS 上發出的一個問題:
這個問題我花了十幾分鐘把主幹寫了出來,但後來和 Allen 討論,而且自己對這個算法有點印象,後來上網查詢才知道這是生命靈數演算法 (The Number of Life),就是那個把生日每個數字相加後得到一個個位數字,那個數字就代表了某些人格特質之類的 ...
後來我又把程式修改了一下,直接傳入生日就可以得到生命靈數:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculate(new DateTime(1962, 10, 3))); // 1+9+6+2+1+0+3 = 22 = 4
Console.WriteLine(Calculate(new DateTime(2001, 3, 5))); // 2+0+0+1+3+5 = 11 = 2
Console.WriteLine(Calculate(new DateTime(1978, 5, 26))); // 1+9+7+8+5+2+6 = 38 = 11 = 2
Console.ReadLine();
}
public static string Calculate(DateTime Birthday)
{
// convert birthday to number (0-99).
int numeric = GetNumericFromBirthday(Birthday);
string template1 = "{0},{1}";
string template2 = "{0}/{1},{2}";
string template3 = "{0}/{1}/{2},{3}";
List<int> nums = new List<int>();
int index = 0;
nums.Add(numeric);
while (true)
{
if ((nums[index] / 10) > 0)
nums.Add((nums[index] / 10) + (nums[index] % 10));
else
{
nums.Add(nums[index]);
break;
}
index++;
}
int[] nums2 = nums.ToArray();
if (nums.Count == 2)
return string.Format(template1, nums2[0], nums2[1]);
else if (nums.Count == 3)
return string.Format(template2, nums2[0], nums2[1], nums2[2]);
else
return string.Format(template3, nums2[0], nums2[1], nums2[2], nums[3]);
}
private static int GetNumericFromBirthday(DateTime Birthday)
{
int result = 0;
string bstr = Birthday.ToString("yyyyMMdd");
foreach (char c in bstr)
result += Convert.ToInt32(c.ToString());
return result;
}
}
}
Allen 對我這支程式有一點小小的 concern,就是我把結果歷程都列出來了,不過因為我是呈現和邏輯分離,所以很好改,只要改一下 template 和 string.Format 就可以得到他要的結果 :)