每天清晨,當(dāng)?shù)谝豢|陽光灑在湖面上,一個身影便會出現(xiàn)在湖心小島上。她坐在一塊大石頭上,周圍被茂盛的植物環(huán)繞,安靜地沉浸在數(shù)學(xué)的世界中。
這個姑娘叫小悅,她的故事在這個美麗的湖心小島上展開。每天早晨,她都會提前來到湖邊,仔細觀察水下的植物,然后抽出時間來鉆研一元x次方程。她身上的氣息混合著湖水的清新和植物的芬芳,形成一種獨特的味道,讓人感到寧靜與祥和。
然而,一元x次方程的展開對于小悅來說,并不是一件容易的事。這個看似簡單的數(shù)學(xué)問題,卻困擾了她許久。然而,小悅并沒有向困難低頭,她堅信,只要努力,就一定能夠找到解決的方法。
在這座小島上,小悅度過了無數(shù)個早晨。她反復(fù)琢磨著方程的特點,嘗試尋找解法。有時候,她會陷入深深的思考,甚至忘記時間;有時候,她會突然靈光一閃,興奮地寫下展開式的公式。每一個早晨,小悅都在進步,她的眼中閃耀著對知識的渴望和對夢想的堅定。
終于有一天,通過前面的積累,小悅靈光一閃,意識到她可以通過將一元x次方程的每一項分別展開,然后再將這些展開式合并起來,得到一元x次方程的展開式。于是她拿起筆和紙,開始耐心地展開每一項。首先,她展開了一元x次方程中的常數(shù)項,接著展開了一次項、二次項、三次項……,最后將所有展開式合并起來,得到了一元x次方程的展開式。小悅看著自己長期努力得來的成果,激動得熱淚盈眶。
她無法掩飾內(nèi)心的喜悅,興奮地在湖邊跳躍著。湖面上的波紋在陽光的照射下閃著金光,似乎在為她的成功歡呼。那一刻,小悅覺得自己仿佛成為了湖水的一部分,與周圍的環(huán)境融為一體。
隨著時間的推移,小悅在島上的生活也變得更加豐富多彩。她開始嘗試將數(shù)學(xué)知識應(yīng)用到日常生活中,在烹飪時運用幾何學(xué)來切蛋糕,或者在散步時用代數(shù)知識來計算最短路徑問題。這些小小的嘗試讓小悅意識到,知識不僅僅是為了考試和學(xué)術(shù),它更是一種工具,可以幫助她更好地生活。
這個美麗的湖心小島成為了小悅成長的見證。她在知識的海洋中探索,用數(shù)學(xué)來解讀自然界的奧秘。清晨的陽光照耀在她的書桌上,給她帶來溫暖和勇氣。傍晚時分,當(dāng)夕陽灑在湖面上,小悅坐在窗前,靜靜地看著湖面的金輝漸漸消失在暮色中。
小悅面臨的一元多次方程的展開式問題如下,她是如何處理呢:
輸入一個帶有一個單字符變量的表達式,并將其展開。表達式的形式為(ax+b)^n,其中a和b是整數(shù),可以是正的,也可以是負的,x是任何單字符變量,n是自然數(shù)。如果a=1,則變量前面不會放置任何系數(shù)。如果a=-1,則變量前面將放一個“-”。
展開后的表達式應(yīng)以字符串形式返回,格式為ax^b+cx^d+ex^f。。。其中a、c和e是項的系數(shù),x是原始表達式中傳遞的原始一個字符變量,b、d和f是每個項中x的冪,并且是遞減的。
如果項的系數(shù)為零,則不應(yīng)包括該項。如果一個項的系數(shù)為1,則不應(yīng)包括該系數(shù)。如果項的系數(shù)為-1,則只應(yīng)包含“-”。如果項的冪為0,則只應(yīng)包括系數(shù)。如果項的冪為1,則應(yīng)排除插入符號和冪。
示例:
EdmSolution.Expand("(x+1)^2"); // returns "x^2+2x+1"
EdmSolution.Expand("(p-1)^3"); // returns "p^3-3p^2+3p-1"
EdmSolution.Expand("(2f+4)^6"); // returns "64f^6+768f^5+3840f^4+10240f^3+15360f^2+12288f+4096"
EdmSolution.Expand("(-2a-4)^0"); // returns "1"
EdmSolution.Expand("(-12t+43)^2"); // returns "144t^2-1032t+1849"
EdmSolution.Expand("(r+0)^203"); // returns "r^203"
EdmSolution.Expand("(-x-1)^2"); // returns "x^2+2x+1"
算法實現(xiàn):
1 public class EdmSolution 2 { 3 // 定義一個只讀的靜態(tài)正則表達式對象,用于匹配表達式的模式 4 private readonly static Regex pattern = new Regex(@"^\((-?\d*)(.)([-+]\d+)\)\^(\d+)$", RegexOptions.Compiled); 5 6 // 定義一個靜態(tài)方法,用于展開給定的表達式 7 public static string Expand(string expr) 8 { 9 // 使用正則表達式匹配給定的表達式,并將匹配結(jié)果轉(zhuǎn)換為字符串?dāng)?shù)組 10 var matches = pattern.Matches(expr).Cast<Match>().First().Groups.Cast<Group>().Skip(1).Select(g => g.Value).ToArray(); 11 12 // 解析匹配結(jié)果中的各個分組,并賦值給對應(yīng)的變量 13 var a = matches[0].Length == 0 ? 1 : matches[0] == "-" ? -1 : int.Parse(matches[0]); 14 var x = matches[1]; 15 var b = int.Parse(matches[2]); 16 var n = int.Parse(matches[3]); 17 18 // 計算系數(shù)f的初始值,使用BigInteger類處理大整數(shù) 19 var f = new BigInteger(Math.Pow(a, n)); 20 21 // 根據(jù)系數(shù)f的值確定常數(shù)c的值 22 var c = f == -1 ? "-" : f == 1 ? "" : f.ToString(); 23 24 // 處理特殊情況:指數(shù)為0或常數(shù)為0的情況 25 if (n == 0) return "1"; 26 if (b == 0) return $"{c}{x}{(n > 1) ? "^" : ""}{n}"; 27 28 // 創(chuàng)建一個StringBuilder對象,用于存儲展開后的表達式 29 var res = new StringBuilder(); 30 31 // 循環(huán)展開表達式的每一項 32 for (var i = 0; i <= n; i++) 33 { 34 // 根據(jù)系數(shù)f的符號和當(dāng)前項的位置,添加"+"或"-"符號 35 if (f > 0 && i > 0) res.Append("+"); 36 if (f < 0) res.Append("-"); 37 38 // 添加系數(shù)的絕對值,如果系數(shù)大于1或當(dāng)前項不是第一項 39 if (i > 0 || f * f > 1) res.Append($"{BigInteger.Abs(f)}"); 40 41 // 添加變量x,如果當(dāng)前項不是最后一項 42 if (i < n) res.Append(x); 43 44 // 添加指數(shù)符號和指數(shù)值,如果當(dāng)前項不是倒數(shù)第二項 45 if (i < n - 1) res.Append($"^{n - i}"); 46 47 // 更新系數(shù)f的值 48 f = f * (n - i) * b / a / (i + 1); 49 } 50 51 // 將StringBuilder對象轉(zhuǎn)換為字符串,并返回展開后的表達式 52 return res.ToString(); 53 } 54 }
算法運行步驟:EdmSolution.Expand("(-5m+3)^4")
1. 匹配表達式:(-5m+3)^4
2. 使用正則表達式匹配給定的表達式,得到匹配結(jié)果:
- matches[0] = "-5"
- matches[1] = "m"
- matches[2] = "+3"
- matches[3] = "4"
3. 解析匹配結(jié)果中的各個分組:
- a = -5
- x = "m"
- b = 3
- n = 4
4. 計算系數(shù)f的初始值:f = (-5)^4 = 625
5. 根據(jù)系數(shù)f的值確定常數(shù)c的值:c = ""
6. 檢查特殊情況:n = 4,不為0;b = 3,不為0
7. 創(chuàng)建StringBuilder對象res,用于存儲展開后的表達式
8. 開始循環(huán)展開表達式的每一項:
- 第一項:i = 0
- f > 0,不添加"+"符號
- f * f > 1,添加系數(shù)的絕對值:625
- i < n,添加變量x:"m"
- i < n - 1,添加指數(shù)符號和指數(shù)值:"^4"
- 更新系數(shù)f的值:f = 625 * (4 - 0) * 3 / -5 / (0 + 1) = -1500
- 第二項:i = 1
- f < 0,添加"-"符號
- f * f > 1,添加系數(shù)的絕對值:1500
- i < n,添加變量x:"m"
- i < n - 1,添加指數(shù)符號和指數(shù)值:"^3"
- 更新系數(shù)f的值:f = -1500 * (4 - 1) * 3 / -5 / (1 + 1) = 1350
- 第三項:i = 2
- f < 0,添加"-"符號
- f * f > 1,添加系數(shù)的絕對值:1350
- i < n,添加變量x:"m"
- i < n - 1,添加指數(shù)符號和指數(shù)值:"^2"
- 更新系數(shù)f的值:f = 1350 * (4 - 2) * 3 / -5 / (2 + 1) = -540
- 第四項:i = 3
- f < 0,添加"-"符號
- f * f > 1,添加系數(shù)的絕對值:540
- i < n,添加變量x:"m"
- i < n - 1,不添加指數(shù)符號和指數(shù)值
- 更新系數(shù)f的值:f = 540 * (4 - 3) * 3 / -5 / (3 + 1) = 81
- 第五項:i = 4
- f < 0,添加"-"符號
- f * f > 1,添加系數(shù)的絕對值:81
- i < n,不添加變量x
- i < n - 1,不添加指數(shù)符號和指數(shù)值
- 更新系數(shù)f的值:f = 81 * (4 - 4) * 3 / -5 / (4 + 1) = 0
9. 循環(huán)結(jié)束,返回StringBuilder對象res轉(zhuǎn)換后的字符串:"625m^4-1500m^3+1350m^2-540m+81"
10. 斷言結(jié)果與期望值相等,測試通過
測試用例:文章來源:http://www.zghlxwxcb.cn/news/detail-705739.html
1 namespace Solution 2 { 3 using NUnit.Framework; 4 using System; 5 using System.Collections.Generic; 6 using System.Text; 7 using System.Text.RegularExpressions; 8 9 [TestFixture] 10 public class SolutionTest 11 { 12 [Test] 13 public void testBPositive() 14 { 15 Assert.AreEqual("1", EdmSolution.Expand("(x+1)^0")); 16 Assert.AreEqual("x+1", EdmSolution.Expand("(x+1)^1")); 17 Assert.AreEqual("x^2+2x+1", EdmSolution.Expand("(x+1)^2")); 18 Assert.AreEqual("x^3+3x^2+3x+1", EdmSolution.Expand("(x+1)^3")); 19 Assert.AreEqual("x^4+4x^3+6x^2+4x+1", EdmSolution.Expand("(x+1)^4")); 20 Assert.AreEqual("x^5+5x^4+10x^3+10x^2+5x+1", EdmSolution.Expand("(x+1)^5")); 21 Assert.AreEqual("1", EdmSolution.Expand("(x+2)^0")); 22 Assert.AreEqual("x+2", EdmSolution.Expand("(x+2)^1")); 23 Assert.AreEqual("x^2+4x+4", EdmSolution.Expand("(x+2)^2")); 24 Assert.AreEqual("x^3+6x^2+12x+8", EdmSolution.Expand("(x+2)^3")); 25 Assert.AreEqual("x^4+8x^3+24x^2+32x+16", EdmSolution.Expand("(x+2)^4")); 26 Assert.AreEqual("x^5+10x^4+40x^3+80x^2+80x+32", EdmSolution.Expand("(x+2)^5")); 27 Assert.AreEqual("t^5+10t^4+40t^3+80t^2+80t+32", EdmSolution.Expand("(t+2)^5")); 28 Assert.AreEqual("y^15+75y^14+2625y^13+56875y^12+853125y^11+9384375y^10+78203125y^9+502734375y^8+2513671875y^7+9775390625y^6+29326171875y^5+66650390625y^4+111083984375y^3+128173828125y^2+91552734375y+30517578125", EdmSolution.Expand("(y+5)^15")); 29 } 30 31 [Test] 32 public void testBNegative() 33 { 34 Assert.AreEqual("1", EdmSolution.Expand("(x-1)^0")); 35 Assert.AreEqual("x-1", EdmSolution.Expand("(x-1)^1")); 36 Assert.AreEqual("x^2-2x+1", EdmSolution.Expand("(x-1)^2")); 37 Assert.AreEqual("x^3-3x^2+3x-1", EdmSolution.Expand("(x-1)^3")); 38 Assert.AreEqual("x^4-4x^3+6x^2-4x+1", EdmSolution.Expand("(x-1)^4")); 39 Assert.AreEqual("x^5-5x^4+10x^3-10x^2+5x-1", EdmSolution.Expand("(x-1)^5")); 40 Assert.AreEqual("1", EdmSolution.Expand("(x-2)^0")); 41 Assert.AreEqual("x-2", EdmSolution.Expand("(x-2)^1")); 42 Assert.AreEqual("x^2-4x+4", EdmSolution.Expand("(x-2)^2")); 43 Assert.AreEqual("x^3-6x^2+12x-8", EdmSolution.Expand("(x-2)^3")); 44 Assert.AreEqual("x^4-8x^3+24x^2-32x+16", EdmSolution.Expand("(x-2)^4")); 45 Assert.AreEqual("x^5-10x^4+40x^3-80x^2+80x-32", EdmSolution.Expand("(x-2)^5")); 46 Assert.AreEqual("t^5-10t^4+40t^3-80t^2+80t-32", EdmSolution.Expand("(t-2)^5")); 47 Assert.AreEqual("y^15-75y^14+2625y^13-56875y^12+853125y^11-9384375y^10+78203125y^9-502734375y^8+2513671875y^7-9775390625y^6+29326171875y^5-66650390625y^4+111083984375y^3-128173828125y^2+91552734375y-30517578125", EdmSolution.Expand("(y-5)^15")); 48 } 49 50 [Test] 51 public void testAPositive() 52 { 53 Assert.AreEqual("625m^4+1500m^3+1350m^2+540m+81", EdmSolution.Expand("(5m+3)^4")); 54 Assert.AreEqual("8x^3-36x^2+54x-27", EdmSolution.Expand("(2x-3)^3")); 55 Assert.AreEqual("1", EdmSolution.Expand("(7x-7)^0")); 56 Assert.AreEqual("35831808a^7+20901888a^6+5225472a^5+725760a^4+60480a^3+3024a^2+84a+1", EdmSolution.Expand("(12a+1)^7")); 57 Assert.AreEqual("184528125x^5-123018750x^4+32805000x^3-4374000x^2+291600x-7776", EdmSolution.Expand("(45x-6)^5")); 58 Assert.AreEqual("12c+1", EdmSolution.Expand("(12c+1)^1")); 59 Assert.AreEqual("100000000x^4-4000000x^3+60000x^2-400x+1", EdmSolution.Expand("(100x-1)^4")); 60 Assert.AreEqual("1000x^3+2400x^2+1920x+512", EdmSolution.Expand("(10x+8)^3")); 61 Assert.AreEqual("128x^7-448x^6+672x^5-560x^4+280x^3-84x^2+14x-1", EdmSolution.Expand("(2x-1)^7")); 62 Assert.AreEqual("81t^2", EdmSolution.Expand("(9t-0)^2")); 63 } 64 65 [Test] 66 public void testANegative() 67 { 68 Assert.AreEqual("625m^4-1500m^3+1350m^2-540m+81", EdmSolution.Expand("(-5m+3)^4")); 69 Assert.AreEqual("-8k^3-36k^2-54k-27", EdmSolution.Expand("(-2k-3)^3")); 70 Assert.AreEqual("1", EdmSolution.Expand("(-7x-7)^0")); 71 Assert.AreEqual("-35831808a^7+20901888a^6-5225472a^5+725760a^4-60480a^3+3024a^2-84a+1", EdmSolution.Expand("(-12a+1)^7")); 72 Assert.AreEqual("-184528125k^5-123018750k^4-32805000k^3-4374000k^2-291600k-7776", EdmSolution.Expand("(-45k-6)^5")); 73 Assert.AreEqual("-12c+1", EdmSolution.Expand("(-12c+1)^1")); 74 Assert.AreEqual("100000000x^4+4000000x^3+60000x^2+400x+1", EdmSolution.Expand("(-100x-1)^4")); 75 Assert.AreEqual("-1000x^3+2400x^2-1920x+512", EdmSolution.Expand("(-10x+8)^3")); 76 Assert.AreEqual("-128w^7-448w^6-672w^5-560w^4-280w^3-84w^2-14w-1", EdmSolution.Expand("(-2w-1)^7")); 77 Assert.AreEqual("-n^5-60n^4-1440n^3-17280n^2-103680n-248832", EdmSolution.Expand("(-n-12)^5"));//extra static test added by docgunthrop 78 Assert.AreEqual("-k^7+28k^6-336k^5+2240k^4-8960k^3+21504k^2-28672k+16384", EdmSolution.Expand("(-k+4)^7"));//extra static test added by docgunthrop 79 Assert.AreEqual("81t^2", EdmSolution.Expand("(-9t-0)^2")); 80 } 81 82 private static readonly Random rand = new Random(); 83 private static int rands(int limit) 84 { 85 return rand.Next(2 * limit + 2) - limit; 86 } 87 88 private static string makeTestCase(int c, int n, int p) 89 { 90 int coeff = 0; 91 while (coeff == 0) 92 coeff = rands(c); 93 return string.Format("({0}{1}{2:+0;-#})^{3}", coeff == 1 ? "" : (coeff == -1 ? "-" : "" + coeff), (char)('a' + rand.Next(26)), rands(n), rand.Next(p) + 2); 94 } 95 96 [Test] 97 public void testRandom() 98 { 99 100 for (int i = 0; i < 50; ++i) 101 { 102 string eq = makeTestCase(16, 32, 4); 103 Assert.AreEqual(ReferenceSolution.Expand(eq), EdmSolution.Expand(eq), "Input: " + eq); 104 } 105 106 for (int i = 0; i < 100; ++i) 107 { 108 string eq = makeTestCase(9, 16, 9); 109 Assert.AreEqual(ReferenceSolution.Expand(eq), EdmSolution.Expand(eq), "Input: " + eq); 110 } 111 } 112 113 #region Reference solution 114 private class ReferenceSolution 115 { 116 117 private static readonly Regex re = new Regex(@"\((-?\d*)([a-z])([\+\-]\d+)\)\^(\d+)"); 118 119 public static string Expand(string expr) 120 { 121 122 Match m = re.Match(expr); 123 124 string sa = m.Groups[1].Value; 125 int a = ("".Equals(sa) ? 1 : ("-".Equals(sa) ? -1 : int.Parse(sa))); 126 127 string x = m.Groups[2].Value; 128 129 string sb = m.Groups[3].Value; 130 int b = "".Equals(sb) ? 0 : int.Parse(sb); 131 132 string se = m.Groups[4].Value; 133 int exp = "".Equals(se) ? 1 : int.Parse(se); 134 if (exp == 0) 135 return "1"; 136 137 if (exp == 1) 138 return sa + x + sb; 139 140 if (b == 0) 141 { 142 long coeff = (long)Math.Pow(a, exp); 143 return (coeff == 1 ? "" : (coeff == -1 ? "-" : coeff.ToString())) + x + "^" + exp; 144 } 145 146 List<long> binoms = new List<long>(); 147 for (int i = 0; i <= exp; ++i) 148 binoms.Add(nk(exp, i)); 149 150 long coeff1 = (long)Math.Pow(a, exp); 151 StringBuilder terms = new StringBuilder(); 152 for (int i = exp; i >= 0; --i) 153 { 154 155 long coeff = coeff1 * binoms[i]; 156 157 if (i != exp && coeff > 0) 158 terms.Append('+'); 159 160 if (coeff < 0) 161 terms.Append('-'); 162 163 if ((coeff != 1 && coeff != -1) || i == 0) 164 terms.Append(coeff > 0 ? coeff : -coeff); 165 166 if (i > 0) 167 terms.Append(x); 168 169 if (i > 1) 170 terms.Append("^" + i); 171 172 coeff1 = coeff1 / a * b; 173 } 174 175 return terms.ToString(); 176 } 177 178 private static readonly List<List<long>> nka = new List<List<long>>(); 179 180 private static long nk(int n, int k) 181 { 182 183 if (n == 0 || k == 0) 184 return 1; 185 186 if (k == 1) 187 return n; 188 189 if (n - k < k) 190 return nk(n, n - k); 191 192 for (int i = nka.Count; i <= n; ++i) 193 nka.Add(new List<long>()); 194 195 List<long> ns = nka[n]; 196 for (int i = ns.Count; i <= k; ++i) 197 ns.Add(0L); 198 199 if (ns[k] != 0) 200 return ns[k]; 201 else 202 { 203 long b = nk(n - 1, k - 1) + nk(n - 1, k); 204 ns[k] = b; 205 return b; 206 } 207 } 208 } 209 #endregion 210 } 211 }
?文章來源地址http://www.zghlxwxcb.cn/news/detail-705739.html
到了這里,關(guān)于【算法】湖心島上的數(shù)學(xué)夢--用c#實現(xiàn)一元多次方程的展開式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!