1. 程式人生 > >設計一個4*4魔方程式,讓魔方的各行值的和等於各列值的和,並且等於兩對角線的和,例如以下魔方,各行各列及兩對角線值的和都是64.

設計一個4*4魔方程式,讓魔方的各行值的和等於各列值的和,並且等於兩對角線的和,例如以下魔方,各行各列及兩對角線值的和都是64.

求4*4的魔方的一般步驟如下:

設定初始魔方的起始值和相鄰元素之間的差值。例如上述魔方的初始魔方的起始值(first)和相鄰元素之間的差值(step)分別為:first=1; step=2;

設定初始魔方元素的值,例如上述魔方的初始魔方為:

1   3   5   7

9   11  13  15

17  19  21  23

25  27  29  31

生成最終魔方。方法如下:

求最大元素值與最小元素值的和sum,該例項的sum是:1+31=32

用32減去初始魔方所有對角線上元素的值,然後將結果放在原來的位置,這樣就可以求得最終魔方。

#include<iostream>
using namespace std;
class Mj
{
	public:
		void getdata();//輸入資料的成員函式; 
		void getfirstmafic();//對陣列進行賦值; 
		void generatemagic();//對陣列進行運算; 
        void printmagic();//輸出結果: 
	private:
	    int m[4][4];//定義一個四維陣列; 
	    int step;//差值; 
	    int first;//第一個值; 
	    int sum;//最大值; 
};
void Mj::getdata()
{
	cin>>first>>step>>sum;//輸入初始值、差值、最大值; 
}
void Mj::getfirstmafic()
{
	int a,b;
	a=first;
	b=step;
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			m[i][j]=a;//進行對陣列的賦值; 
			a+=b;
		}
	}
}
void Mj::generatemagic()
{
	for(int i=0;i<4;i++)
	{
		m[i][i]=sum-m[i][i];//對對角線上的值進行運算; 
		m[i][3-i]=sum-m[i][3-i];//對副對角線上的值運算: 
	}
}
void Mj::printmagic()
{
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			cout<<m[i][j]<<ends;//輸出陣列; 
		}
		cout<<endl;
	}
}
int main()
{
	Mj t1;//定義一個類的物件; 
	t1.getdata();//呼叫成員函式; 
	t1.getfirstmafic();
	t1.generatemagic();
	t1.printmagic();
	return 0;

}