这道题一开始做的时候也是超时,后来去网上查了下发现用动归是可以做,而且避免很多没必要的操作。先定义一个足够大的数组,初始化为0,然后先把一个平方数的情况全部求出来,这些数的数组就赋值为1,接着用1个循环,从1扫到60000,找出2和3的情况,剩下就是4的情况,不必管他们。代码是借鉴网上的,如下
#include<iostream>
#include<cstring>
using namespace std;
int arr[70000]={0};
void deal(){
for(int i=1; i*i <= 60000; i++){
arr[i*i]=1;
}
for(int i=1; i <= 60000; i++){
if(arr[i]==0){
for(int j=1; j*j <= i; j++){
if(arr[i-j*j]==1){
arr[i]=2;
break;
}
if(arr[i-j*j]==2)
arr[i]=3;
}
}
}
}
int main()
{
memset(arr,0,sizeof(arr));
deal();
int test;
cin >> test;
while(test--){
int num;
cin >> num;
if(arr[num]==0) cout << "4" << endl;
else cout << arr[num] << endl;
}
}