APCS程式檢測 -實作題1051029 第2題 最大和

APCS程式檢測 -實作題1051029 第2題 最大和

因為題目中的 M 和 N 都是輸入來的,原本想說用動態宣告陣列或 STL,但是這樣會太複雜,既然題目上說 M 和 N 都 <= 20,那就用 20×20 的二維陣列處理。

如果不清楚二維陣列,可以先來這裡看看
https://husking-studio.com/cpp-2d-array/

第一步:從數字陣列中取最大值的函式

int GetMax(int* pArray, int nNum)
{
	int nMax = pArray[0];
	for (int i = 1; i < nNum; i++)
	{
		if (pArray[i] > nMax)
			nMax = pArray[i];
	}
	return nMax;
}

第二步:在二維陣列中取某一列的方式

int* numGroupN;		//這個是群
for (int i = 0; i < N; i++)
{
	numGroupN = data[i];	//抓出每一個橫列,也就是一群
}

完整程式碼

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int GetMax(int* pArray, int nNum);

int main()
{
	const int MAX_N = 20;
	const int MAX_M = 20;

	int data[MAX_N][MAX_M];

	//題目有說數字都大於 1,所以初始化就用 -1 表示沒被用到的格子
	for (int i = 0; i < MAX_N; i++)
		for (int j = 0; j < MAX_M; j++)
			data[i][j] = -1;

	//處理 N 和 M 的輸入
	string input;
	getline(cin, input);
	stringstream delim(input);
	string pch;

	int N;
	getline(delim, pch, ' ');
	N = stoi(pch);

	int M;
	getline(delim, pch, ' ');
	M = stoi(pch);

	//處理輸入
	string str;
	for (int i = 0; i < N; i++)
	{
		getline(cin, str);
		stringstream delim2(str);
		string pch2;
		for (int j = 0; j < M; j++)
		{
			getline(delim2, pch2, ' ');
			data[i][j] = stoi(pch2);
		}
	}

	//這個陣列用來存每一群的最大值
	int max[MAX_N];
	for (int i = 0; i < MAX_N; i++)
		max[i] = -1;

	int* numGroupN;		//這個是群
	for (int i = 0; i < N; i++)
	{
		numGroupN = data[i];	//抓出每一個橫列,也就是一群
		max[i] = GetMax(numGroupN, M);	//找出一群的最大值,存在 max 陣列裡
	}

	//把每一群的最大值加起來
	int sumGroupN = 0;
	for (int i = 0; i < N; i++)
	{
		sumGroupN = sumGroupN + max[i];
	}
	cout << sumGroupN << endl;

	//這個陣列用來存可以整除總和的數字
	int division[MAX_N];
	for (int i = 0; i < MAX_N; i++)
		division[i] = -1;

	int k = 0;
	for (int i = 0; i < N; i++)
	{
		if (sumGroupN % max[i] == 0)
		{
			division[k] = max[i];
			k++;
		}
	}

	//印出答案
	if (k == 0)//表示沒有數字可以被總和整除
	{
		cout << "-1" << endl;
	}
	else
	{
		for (int i = 0; i < k; i++)
		{
			if (i == k - 1)
				cout << division[i] << endl;
			else
				cout << division[i] << " ";
		}
	}

	system("pause");
	return 0;
}

int GetMax(int* pArray, int nNum)
{
	int nMax = pArray[0];
	for (int i = 1; i < nNum; i++)
	{
		if (pArray[i] > nMax)
			nMax = pArray[i];
	}
	return nMax;
}

在〈APCS程式檢測 -實作題1051029 第2題 最大和〉中有 2 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *