题目很简单。。。我自己写的代码就是超时过不了
下面这个是我自己写的。。。会超时,没优化
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <stack>
#include <map>
#include<set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <cmath>
using namespace std;
int main()
{
int i;
int a;
while(~scanf("%d",&a))
{
int count=0;
if(a==0)
{
printf("1\n");
continue;
}
double q=sqrt(a);
if(floor(q+0.5)==q)
{
count=count+4;
for(i=1;i<q;i++)
{
for(int j=1;j<q;j++)
{
if(i*i+j*j==a)
count=count+4;
}
}
}
else
{
for(i=1;i<floor(q+0.5)+1;i++)
{
for(int j=1;j<floor(q+0.5)+1;j++)
{
if(i*i+j*j==a)
count=count+4;
}
}
}
printf("%d\n",count);
}
return 0;
}
积分赛后完了一问别人,我去,他们也是这个思路啊,当时我还以为是要用到什么思路呢。。。优化的方法,就是不用2个for 循环和 i*i + j*j 来找,直接对需要找的书再次来开根号,优化代码如下。。。。运行时间 62ms。。。。。。。从 1000 ms 都不过,到62ms 就行了。。。。就优化了个for 循环和判断方法
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <stack>
#include <map>
#include<set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
int main()
{
int i;
int a;
while(~scanf("%d",&a))
{
int count=0;
if(a==0)
{
printf("1\n");
continue;
}
double q=sqrt(double(a));
if(floor(q+0.5)==q)
{
count=count+4;
for(i=1;i<q;i++)
{
double num=a-i*i;
num=sqrt(num);
// if(floor(num+0.5)==num)
if(num==int(num))
count+=4;
}
}
else
{
int m=floor(q+0.5)+1;
for(i=1;i<m;i++)
{
double num=a-i*i;
num=sqrt(num);
if(num==int(num))
count+=4;
}
}
printf("%d\n",count);
}
return 0;
}