枚舉的技巧01(能夠少用一層循環):四平方和

題目:四平方和定理,又稱爲拉格朗日定理:每個正整數都可以表示爲至多4個正整數的平方和。如果把0包括進去,就正好可以表示位4個數的平方和。
比如:
5 = 0 ^2 + 0 ^2 + 1 ^2 + 2 ^2
7 = 1 ^2 + 1 ^2 + 1 ^2 + 2 ^2
則對於一個給定的正整數n,可以表示爲:n = a ^ 2 + b ^ 2 + c ^ 2 + d ^ 2.
你需要求出字典序最小的一組解a,b,c,d.
輸入格式
程序輸入一個正整數N(1<=N<=5000000)
輸出格式
輸出4個非負整數a,b,c,d,中間用空分開。
樣例輸入1:
5
樣例輸出1:
0 0 1 2
樣例輸入2:
12
樣例輸出2:
0 2 2 2

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, a, b, c, d;
    cin >> n;
    for(a=0; a*a <= n; a++){
        for(b=a; a*a + b*b <= n; b++){
            for(c=b; a*a + b*b + c*c <= n; c++){
            	d = sqrt(n - a*a - b*b - c*c);//注意
                if(a*a + b*b + c*c + d*d == n){
                    cout << a << " " << b << " " << c << " " << d << endl;
                    return 0;
				}
            }
		}
	}
    return 0;
}

本題沒有任何算法上的難度,純枚舉即可,但是a,b,c,d都用循環表示的話,會超時!所以這裏有一個技巧就是:最後一個數,直接用sqrt得出,sqrt的計算雖然需要時間,但是比循環需要的時間要短一些。當然,sqrt得到的不一定是整數,沒關係!因爲後面用了if做了一次是否相等的判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章