1. 程式人生 > >2015年秋季騰訊校園招聘開發崗筆試題 四道大題之二

2015年秋季騰訊校園招聘開發崗筆試題 四道大題之二

題目:2. 有下圖的題解,請用C/C++程式碼來列出滿足下圖0-100內的所有答案。


分析:用a1--a9表示九個數,其中a3=9,根據圖中的資訊,可以列出如下六個方程,

a1+a2-9=4       (1)

a4-a5*a6=4      (2)

a7+a8-a9=4      (3)

a1+a4/a7=4      (4)

a2-a5*a8=4       (5)

9-a6-a9=4         (6) 

6個方程8個未知數,自然解不出來的,所以如果在確定2個,則另外6個就可以算出來了,那麼確定那兩個呢?分析上面六個式子,由方程(4)則a1<=4範圍一下縮小了很多

另外由(6)a6+a9=5,則a6<=5,a9<=5;那麼a6是否是另一個要確定的數呢?假設是,我們繼續往下算,這樣0=<a1<=4,0=<a6<=5,a2、a9很容易的由a1、a6表示,但是求其他數

的時候,我發現有a4/a7,a5*a8兩項,則其結果必然是兩次方程,求解比較麻煩,所以a6不能是另一個要確定的數了。二次項產生的根源是a4/a7,a5*a8所以,所以避免求解二次方程

要確定a4、a5、a7、a8中的一個又(3)式a7+a8=4+a9<=9,則a7<=9,a8<=9;

所以取固定a1,a7;則分別求得各項如下:

a2=13-a1;

a4=(4-a1)*a7;

a8=(a2-4)*(9-a7)/(a2+a4-8);

a6=9-a7-a8;

a9=5-a6;

a5=(a2-4)/a8;

若求得的某一個值不在0-100的範圍內,則此時的a1,a7不滿足要求,這樣只需兩層迴圈即可;

兩一個重要的問題是題中未說明a1-a9是整數,所以題目應該是有無數個解得;

設a1,a7未整數,則可以算得共有27組解,其中一組全部是整數。程式碼如下

#include<iostream>
#include<iomanip>

using namespace std;

#define IIO std::left<<setw(10)
#define II std::left<<setw(5)
float a1, a2, a3=9;
float a4, a5, a6;
float a7, a8, a9;

void f()
{
	int n = 0;
	for (int i = 0; i <= 4; i++){
		for (int j = 0; j <= 9; j++){
			a1 = (float)i/1.0;
			a7 = (float)j/1.0;

			a2 = 13 - a1;
			a4 = (4 - a1)*a7;

			a8 = (a2-4)*(9-a7) / (a2+a4-8);
			if (a8>100 || a8 < 0)
				continue;
			a6 = 9 - a7 - a8;
			if (a6>100 || a6 < 0)
				continue;
			a9 = 5 - a6;
			if (a9>100 || a9 < 0)
				continue;
			a5 = (a2 - 4) / a8;
			if (a5>100 || a5 < 0)
				continue;

			cout << II << a1 << IIO << a2 << IIO << a3 << " "<< a1 + a2 - a3 <<endl;
			cout << II << a4 << IIO << a5 << IIO << a6 << " "<< a4 - a5 * a6 <<endl;
			cout << II << a7 << IIO << a8 << IIO << a9 << " "<< a7 + a8 - a9 <<endl;
			cout << II << a1 + a4 / a7 << IIO << a2 - a5*a8 << IIO << a3 - a6 - a9 << endl;//驗證
			cout << endl;
			n++;
		}
	}
	cout << n << endl;
}
int main()
{
	f();
	return 0;
}
執行結果如下:27組


全部為整數結果為:

2      11      9

4      1        0

2      7        5

最多一位小數,5組;

繼續下去,若a1,a7為最多一位小數點,執行得結果2283組

  若a1,a7為最多二位小數點,執行得結果224459組

  若a1,a7為最多三位小數點,執行得結果22410696組
  若a1,a7為最多四位小數點,執行得結果2240732806組

  。。。。。。

總結一下:若全部是整數則只有一組解

2      11      9

4      1        0

2      7        5

否則有無陣列解;