优雅的点(2017网易校园招聘)---最详细的解答
时间限制:1秒空间限制:32768K热度指数:68123
算法知识视频讲解
题目描述
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。
输入描述:
输入为一个整数,即为圆半径的平方,范围在32位int范围内。
输出描述:
输出为一个整数,即为优雅的点的个数
示例1
输入
25
输出
12
编程要有良好的思维(这点目前我还有差距),不能看到题目直接上手打(除非很大把握一次性做对),要逐步分析。
首先要读懂题意,
其次寻找算法,
然后最好写出伪代码,
最后实现功能。
首先要读懂题意,
其次寻找算法,
然后最好写出伪代码,
最后实现功能。
这道题目,大概做法就是已知c^2,寻找整数a,b使得a^2 + b^2 = c^2
这样题目就很清晰了,那该怎么处理呢?
首先想到的是循环,a从0开始循环,一直到c,如果存在b是整数,满足勾股定理,那么这对点就是。
现在不考虑负数,因为负数最后个数*2就好。
这道题目我提交了好多遍才成功,问题出在,数据不正确,和超时问题。
这就是具体分类没有搞清楚。
当a=某个数时,这时有a^2 + b^2 = c^2,并且b是整数,这时候a,b就构成了一对点:
此时存在四种情况:
a,b
a,-b
-a,b
-a,-b
当a = b时,b此时应该 等于之前的a,也就是(b,a)之前的,这又是一对点:
此时也是四种情况:
b,a
b,-a
-b,a
-b,-a
这样题目就很清晰了,那该怎么处理呢?
首先想到的是循环,a从0开始循环,一直到c,如果存在b是整数,满足勾股定理,那么这对点就是。
现在不考虑负数,因为负数最后个数*2就好。
这道题目我提交了好多遍才成功,问题出在,数据不正确,和超时问题。
这就是具体分类没有搞清楚。
当a=某个数时,这时有a^2 + b^2 = c^2,并且b是整数,这时候a,b就构成了一对点:
此时存在四种情况:
a,b
a,-b
-a,b
-a,-b
当a = b时,b此时应该 等于之前的a,也就是(b,a)之前的,这又是一对点:
此时也是四种情况:
b,a
b,-a
-b,a
-b,-a
要注意两种特殊的情况:
a = 0,且b为整数时或者b = 0,a为整数时:
每一个有两种情况:
a,0
-a,0
0,b
0,-b
a = 0,且b为整数时或者b = 0,a为整数时:
每一个有两种情况:
a,0
-a,0
0,b
0,-b
a = b 且都为整数时:
有:
a,a
a,-a
-a,a
-a,-a
因为a=b所以就只有这四种
有:
a,a
a,-a
-a,a
-a,-a
因为a=b所以就只有这四种
这里有一个最基本的算法,需要知道,就是判断这个数是不是整数的算法:
double a;
if(a==int(a)) return true;
double a;
if(a==int(a)) return true;
一、第一种算法:
我已开始的做法,用到了两个循环,但也是最容易懂得:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;//r为半径;
cout <<"请输入半径的平方:"<<endl;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))//位于坐标轴上的半径为整数,那么必有x或者y为整数,另一个为0
{
count = count + 4;
//一共四种情况a,0 -a,0 0,b 0,-b
}
for(x = 1; x< r; x++)
{
for(y = 1; y < r; y++){
if((x*x+y*y) == z){count = count + 4}
}
}
cout << count << endl;
}
我已开始的做法,用到了两个循环,但也是最容易懂得:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;//r为半径;
cout <<"请输入半径的平方:"<<endl;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))//位于坐标轴上的半径为整数,那么必有x或者y为整数,另一个为0
{
count = count + 4;
//一共四种情况a,0 -a,0 0,b 0,-b
}
for(x = 1; x< r; x++)
{
for(y = 1; y < r; y++){
if((x*x+y*y) == z){count = count + 4}
}
}
cout << count << endl;
}
//两个for循环,只是为了寻找到另一个与x配对的y,这里犯傻了,y明明可以直接求出来,只要判断y是整数即可,所以改进后:
for(x=0; x < r; x++)
y = sqrt(z - x*x);
if(y == int (y) )//判断y是整数
count = count + 4;
这样就变成了一个循环
所以,最后完整通过的代码是:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))
{
count = count + 4;
}
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))
{
count = count + 4;
}
for(x = 1; x< r; x++)
{
y = sqrt(z - x*x);
if(y == int(y)){
count =count + 4;
}
}
cout << count << endl;
}
{
y = sqrt(z - x*x);
if(y == int(y)){
count =count + 4;
}
}
cout << count << endl;
}
如果你想查看具体是哪些点,代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))
{
count = count + 4;
x = 0;
y = sqrt(z - x*x);
cout << "(" << x << "," << y << ")"<<endl;
cout << "(" << x << "," << -y << ")"<<endl;
cout << "(" << y << "," << x << ")"<<endl;
cout << "(" << y << "," << -x << ")"<<endl;
}
#include<cmath>
using namespace std;
int main()
{
double x,y,z,r;
cin >> z;
r = sqrt(z);
int count = 0;
if(r == (int)(r))
{
count = count + 4;
x = 0;
y = sqrt(z - x*x);
cout << "(" << x << "," << y << ")"<<endl;
cout << "(" << x << "," << -y << ")"<<endl;
cout << "(" << y << "," << x << ")"<<endl;
cout << "(" << y << "," << -x << ")"<<endl;
}
for(x = 1; x< r; x++)
{
y = sqrt(z - x*x);
if(y == int(y)){
count =count + 4;
cout << "(" << x << "," << y << ")"<<endl;
cout << "(" << x << "," << -y << ")"<<endl;
cout << "(" << -x << "," << y << ")"<<endl;
cout << "(" << -x << "," << -y << ")"<<endl;
}
}
cout << count << endl;
}
{
y = sqrt(z - x*x);
if(y == int(y)){
count =count + 4;
cout << "(" << x << "," << y << ")"<<endl;
cout << "(" << x << "," << -y << ")"<<endl;
cout << "(" << -x << "," << y << ")"<<endl;
cout << "(" << -x << "," << -y << ")"<<endl;
}
}
cout << count << endl;
}