题目描述
假设圆的圆心位于(0,0),半径为 r ,请问半径为 r 的圆上有多少个整点?
整点 (x,y) ,即 x、y 均为整数。
整点 (x,y) ,即 x、y 均为整数。
输入
第一行一个正整数 T,表示测试数据的组数 ( 1<= T <= 11000)
接下来每行一个正整数 S ,S = r * r ( 1 <= S <= 5,000,000 )
接下来每行一个正整数 S ,S = r * r ( 1 <= S <= 5,000,000 )
输出
每行一个整数,表示整点的个数。
样例输入
2
25
3
样例输出
12
0
提示
“圆上” 是指落在闭合曲线上,而不是圆面上。
用于开方的函数 sqrt() 在头文件 <math.h> 中
本题有多组数据,请注意不要相互影响。
#include
#include
using namespace std;
int main()
{
int T;
cin>>T;
int s;
double x,y;
int num;
for(int i=1;i<=T;i++)
{
cin>>s;
num=0;
for(x=1;x<=((int)sqrt(s));x++)
{
y=(int)sqrt(s-x*x);
if(y!=0 && y==(sqrt(s-x*x)))
{
num++;
}
}
num=num*4;
if((int)sqrt(s)==sqrt(s))
{
num+=4;
}
cout<
<
1.注意问题:题意的理解上不能出错;题目指的是圆上的整数点而不是圆内的整数点
2.算法的优化:
(1)起初采用的方法是二重嵌套循环,判断是否存在一个x,一个y同时为正数
(算法的优化主要体现在循环结构的优化上)
(2)优化后的算法:采用循环x而利用等式直接判断y是否为整数,减少一重循环
3.此类优化适用的题型:二重嵌套循环中,两个循环变量存在某种等式关系,可以利用该等式关系减少一层循环