1. 程式人生 > >極差問題:c++求解1-10的極差問題的初等解法

極差問題:c++求解1-10的極差問題的初等解法

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

如下截圖所示: