極差問題:c++求解1-10的極差問題的初等解法
阿新 • • 發佈:2019-01-25
1.問題的描述
在黑板上一共有1-10 共10 個數,,進行如下操作:每次擦去其中的兩個數a和b,然後在數列中加入一個數a*b+1,如此下去直至黑板上只有一個數,在所按的操作方式得到的數當中,最大的為max,最小的為min,則該數列的極差定義為M=max-min;對於給定的數列: arr[] = { 1,6,5,9,8,4,3,7,2,10 };程式設計計算極差M。
2.問題的分析
假設有5個數,分別為:1,4,3,2,5,如果首先先對這五個數進行從小到大的排序,即為:1,2,3,4,5,;合併前兩個數是得到的數列是:3,3,4,5;一次類推,最後得到的是一個值,為211,如果對這5個數進行從大到小的排序,即為:5,4,3,2,1;然後進行如上相同的操作,最後得到的值為:130;所以可見當是從小到大的排序時,所求得的為最大值,反之則是最小值,而且最大值與最小值的求解過程都是類似的,以此類推也可得到求N個數的極差。
3.思路
用一個數組arr[10]儲存1-10這十個數,然後分別進行從小到大和從大到小的排序,接著根據分析中的操作分別求出最大值和最小值,最後即可求出1-10 的極差。
原始碼如下:
#include "stdafx.h" #include<algorithm> #include<iostream> using namespace std; //從小到大排序的輔助函式 int cmp(int const a, int const b) { return a < b; } //從大到小排序的輔助函式 int cmp1(int const t, int const k) { return t > k; } //最大值函式 int m_max(int a[]) { int s; //不斷更新當前所求的結果,最後返回所求的最大值 sort(a, a + 10, cmp); for (int i = 0; i < 9; i++) { a[i] = a[i] * a[i + 1] + 1; a[i + 1] = 0; s = a[i]; sort(a,a+10,cmp); } return s; } //最小值函式 int m_min(int b[]) { int s1; //不斷更新當前所求的結果,最後返回所求的最小值 sort(b, b + 10, cmp1); for(int j = 0; j < 9; j++) { b[0] = b[0] * b[1] + 1; b[1] = 0; s1 = b[0]; sort(b,b+10,cmp1); } return s1; } int main() { int arr[] = { 1,6,5,9,8,4,3,7,2,10 }; int copy[10]; //拷貝陣列,防止原陣列在傳參時被修改 for (int j = 0; j < 10; j++) copy[j] = arr[j]; int max = m_max(arr); int min = m_min(copy); cout << "1-10的極差為:" << endl; cout<< max - min << endl; return 0; }
最後的結果為:2991603
如下截圖所示: