四平方和--第七屆藍橋杯省賽C++A/B組

題目描述
在這裏插入圖片描述

AC代碼

/*
解法1:
暴力枚舉,枚舉每一個數字,但是,這樣子即便優化後,三重循環,仍然會超時!不可選!

解法2:
利用空間去換時間
開始的時候,爲了方便,直接開闢出五百萬的int類型空間,反正空間大,不慫

然後計算出a,b這兩個數字的平方和,並記錄下,數組下標是這兩數字的平方和,數組裏面的
值是b這個數字的值!

然後計算c,d,此時,計算出c的平方和d的平方,如果有對應a的平方和c的平方,可以組成
n的和,即是解!排序輸出即可!因爲是從0開始的,前面的計算a平方+b平方,也只計算字典序
小的一組,所以,直接排序輸出即可! 
  
*/


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;


int nums[5000000];
int N;
int main()
{
	cin >> N;
	memset(nums,0xff,5000000*sizeof(int));//數組每一個數字置-1 
	
	for(int i = 0; i*i <= N; ++i)
	{
		for(int j = i; i*i+j*j <= N; ++j)
		{
			if(nums[i*i+j*j] == -1)//如果不是-1,則代表前面已經有過了,不存入! 
				nums[i*i+j*j] = j;
		}
	}
	
	//推算 c,d的值! 
	for(int i = 0; i*i <= N; ++i)
	{
		for(int j = i; i*i + j*j <= N; ++j)
		{
			if(nums[N - i*i - j*j] != -1)
			{
				int k = nums[N-i*i-j*j];
				int m = sqrt(N-i*i-j*j-k*k);
				
				//其實這裏j >= i;k >=m ,但是爲了方便,直接放在數組裏,用排序,損耗時間可忽略不計 
				int result[4]; 
				result[0] = i;
				result[1] = j;
				result[2] = k;
				result[3] = m; 
				
				sort(result, result+4);
				
				for(int u = 0; u < 4; u++)
				{
					cout << result[u] <<" ";
				}
				
				return 0;
			}
		}
	}
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章