1. 程式人生 > >2016第七屆藍橋杯C/C++ B組省賽題解 H題

2016第七屆藍橋杯C/C++ B組省賽題解 H題

四平方和

四平方和定理,又稱為拉格朗日定理:

每個正整數都可以表示為至多4個正整數的平方和。

如果把0包括進去,就正好可以表示為4個數的平方和。

比如:

5 = 0^2 + 0^2 + 1^2 + 2^2

7 = 1^2 + 1^2 + 1^2 + 2^2

(^符號表示乘方的意思)

對於一個給定的正整數,可能存在多種平方和的表示法。

要求你對4個數排序:

0 <= a <= b <= c <= d

並對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最後輸出第一個表示法

程式輸入為一個正整數N (N<5000000)

要求輸出4個非負整數,按從小到大排序,中間用空格分開

例如,輸入:

5

則程式應該輸出:

0 0 1 2

再例如,輸入:

12

則程式應該輸出:

0 2 2 2

再例如,輸入:

773535

則程式應該輸出:

1 1 267 838

資源約定:

峰值記憶體消耗 < 256M

CPU消耗 < 3000ms

三個迴圈處理 進行優化 只會暴力求解。

#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

int main(){

    int i,j,k,p;
    int n,m;
     int o;
    while(scanf("%d",&n)!=EOF){
            int flag=0;
        for(i=0;i*i<n;i++){
            for(j=0;j*j<n;j++){
                for(k=0;k*k<n;k++){
                    m=n-i*i-j*j-k*k;
                    o=sqrt(m);
                    if(o*o==m){
                        flag=1;
                        break;
                    }
                }
                if(flag) break;
            }
            if(flag) break;
        }
        printf("%d %d %d %d\n",i,j,k,o);
    }
return 0;
}