近日看見了一張來自網上的圖
父親看見這圖就覺得十分有意思,就給許多村里的大學生們看讓他們算,如圖這是一道並不難的三元一次方程組問題,我心里一盤算覺得正常算並不能體現我IT精英的與眾不同,於是我就說看我變個程序來解題。結果當然遵循裝B遭雷劈的至高真理。
這道題目的答案是3.5,4.5,9.5和3.5。
為了盡快解決問題我就是用了最簡單的邏輯方法讓計算機用大量的運算去堆答案代碼如下
1 #include<iostream> 2 using namespace std; 3 void main() 4 { 5 double a, b, c; 6 for (a = 0; a <= 10; a += 0.1) 7 { 8 for (b = 0; b <= 10; b += 0.1) 9 { 10 for (c = 0; c <= 10; c += 0.1) 11 { 12 if (a + b == 8 && c - a == 6 && a + c == 13) 13 { 14 cout << a << b << c; 15 } 16 } 17 } 18 } 19 system("pause"); 20 }
按照如圖的邏輯似乎沒有任何問題然而運行卻並不能得到結果我百思不得其解於是就一步一步地調試去看每次循環各變量的值
可以看到上圖中所有變量的值都不是我們真正設定的值,他們是無限接近的近似值所以並不存在滿足判斷條件的a,b,c的值
我也就沒能得到答案,而我又不死心的再次去嘗試,發現如果我把初始值設為3.4,4.4,9.4,即只循環一次就可以得到正確結果
然后就成功的輸出了
這就很尷尬了據我大一新生的揣測,我覺得是因為double類型是以二進制存儲數據顯然產生無限接近設定值的實際值的原因是遇到了二進制除不盡的值,如3.3所以在第一幅圖中因為設定的初始值是3.3 所以從一開始就是一個注定不能得到小數點后一位的值所以運算失敗,而第二次我們把初值改為了3.4於是得到了正常的小數,所以經過一次+0.1計算后便得到了符合條件的值。成功得到了答案(注意這里0.1也是默認為double類型的值所以如果你累加的是0.3,那么仍然的不到想要的准確值)。
因為C++只是在學校老師教了一點所以我並沒有繼續研究如何解決這操蛋的問題,幸好我還自學了C#想到了C#中的十進制類型decimal於是我又用C#寫了一遍
1 using System; 2 namespace 計算 3 { 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 decimal a, b, c; 9 for(a=0m; a <= 10m; a+=0.1m) 10 { 11 for (b = 0m; b<= 10m; b+=0.1m) 12 { 13 for (c = 0m; c <= 10m; c+=0.1m) 14 { 15 if (a+b == 8m && c-a == 6m&&a+c==13m) 16 { 17 Console.WriteLine("a={0},b={1},c={2}", a, b,c); 18 } 19 } 20 } 21 } 22 Console.ReadKey(); 23 } 24 } 25 }
妥妥的十進制,爽。
大一剛讀完有什么不對的地方多多指教