1. 程式人生 > >1,2,3,4,5,6,7,8,9共9個數組成3個分數

1,2,3,4,5,6,7,8,9共9個數組成3個分數

MixCMul最小公倍數函式,方便分數計算,避免小數
printmol 將一個固定陣列得到三個分數, 判斷兩分數相加是否等於第三個

Grial    陣列的各種排列

不說了,看程式碼:

static void showArr(int arr[], int len = 9)
{
	cout<<arr[0];cout<<"/";
	cout<<arr[1];
	cout<<arr[2];cout<<" + ";
	cout<<arr[3];cout<<"/";
	cout<<arr[4];
	cout<<arr[5];cout<<" = ";
	cout<<arr[6];cout<<"/";
	cout<<arr[7];
	cout<<arr[8];
	cout<<endl;
}

// 求最大公倍數
static int MixCMul(int a, int b)
{
	int max = a>b?a:b;
	while (true)
	{
		if (max%a == 0 && max%b == 0)
			break;
		max++;
	}
	return max;
}

static void printmol(int arr[], int len = 9)
{
	int mol[3]			= {0};		// 分子
	int Den[3]			= {0};		// 分母

	// 按倍數擴充後的,方便比較
	int temmol[4]		= {0};		// 分子

	int MixCMul1, MixCMul2;

	for (size_t i = 0; i < 3; i++)
	{
		mol[i] = arr[i*3];
		Den[i] = arr[i*3+1]*10 + arr[i*3+2];
	}

	// 計算第一和第二個分數分母的最小公倍數,同時擴大分子
	MixCMul1  = MixCMul(Den[0], Den[1]);
	temmol[0] = MixCMul1/Den[0] * mol[0];
	temmol[1] = MixCMul1/Den[1] * mol[1];
	
	// 第一第二分數的分子相加,存到第四個分數
	temmol[3] = temmol[0] + temmol[1];

	// 再計算第一和第三個分數分母的最小公倍數,同時擴大分子
	MixCMul2  = MixCMul(MixCMul1, Den[2]);
	temmol[3] = temmol[3]* (MixCMul2 / MixCMul1);
	temmol[2] = mol[2]* (MixCMul2 / Den[2]) ;

	// 第一第三分數的分子比較
	if (temmol[3] == temmol[2])
	{
		showArr(arr);
	}
		
}

// 陣列的各種排列
static void Grial(int a[], int n,int m)
{
    if (n == m)
    {
  /*      for (int i = 0; i < m; i++)
			cout << a[i] << " ";
		cout <<endl;*/
		printmol(a);
    }
    else
    {
        for (int i = n; i < m; i++)
        {
            std::swap(a[i],a[n]);
            Grial(a,n+1,m);
            std::swap(a[i],a[n]);
        }
    }
}

 void main()
{
#define ARR_NUM  9
	int arr[ARR_NUM]	= {1, 2, 3, 4, 5, 6, 7, 8, 9};
	Grial(arr, 0, ARR_NUM);
}