開通博客開始第一次寫發表算法博客。深知一半算法考試都是用C,C++,由於大四開始到今年畢業工作到現在一直從事C#開發,C++用得很少了。鏈表,指針也只知道一個概念了。用得沒以前熟練了。所以后續更新的算法題我都是基於C#語法的。算法主要體現的是解題思路。跟題目一樣,本次算法主要實現大數據相加。
解題思路:
1. 將大數據存儲到一個鏈表中,C#中用List<int>來存儲,每個節點表示每一位的數字. {1,2,3,4,5} =》12345 和{9,6,5,9,5} =》96595 (C,C++就需要自己通過指針來實現鏈表功能了。)
2. 對數據的每一位進行相加。不進行進位操作。{10,8,8,13,10}
3. 遍歷集合,對大於或者等於10的實現進位操作.{1,0,8,9,4,0}
Code 如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BigNumAdd { public class Program { public static void Main(string[] args) { List<int> num1 = new List<int>() { 1, 2, 3, 4, 5 }; List<int> num2 = new List<int>() { 9, 6, 5, 9, 5 }; List<int> sum = AddTwoNum(num1, num2); Console.WriteLine(string.Join("", sum)); Console.ReadKey(); } /// <summary> /// 兩數字相加 /// </summary> /// <param name="num1"></param> /// <param name="num2"></param> /// <returns></returns> private static List<int> AddTwoNum(List<int> num1, List<int> num2) { List<int> longNum = null; // 找出長的數字 List<int> lessNum = null; // 找出短的數字 if (num1.Count() >= num2.Count()) { longNum = num1; lessNum = num2; } else { longNum = num2; lessNum = num1; } // 每一位置數據相加,對應前面思路解析第二條 for (int index = 0; index < lessNum.Count(); index++) { longNum[longNum.Count() - 1 - index] += lessNum[lessNum.Count() - 1 - index]; } CheckNum(longNum); // 遍歷集合實現進位功能.對應前面思路的第三條 return longNum; } /// <summary> /// 將每一個位置數據大於或等於10的進位 /// </summary> /// <param name="bigNum">大數字</param> private static void CheckNum(List<int> bigNum) { for (int index = bigNum.Count() - 1; index >= 1; index--) { if (bigNum[index] >= 10) { bigNum[index - 1] += bigNum[index] / 10; //進位 bigNum[index] = bigNum[index] % 10; // 求余數 } } if (bigNum[0] > 10) { bigNum.Insert(0, bigNum[0] / 10); bigNum[1] = bigNum[1] % 10; } } } }