优雅的点(2017网易校园招聘)---最详细的解答

时间限制:1秒空间限制:32768K热度指数:68123
算法知识视频讲解

题目描述

小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为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,且b为整数时或者b = 0,a为整数时:
每一个有两种情况:
 a,0
-a,0
0,b
0,-b
a = b 且都为整数时:
有:
a,a
a,-a
-a,a
-a,-a
因为a=b所以就只有这四种
这里有一个最基本的算法,需要知道,就是判断这个数是不是整数的算法:
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;
}

优雅的点(2017网易校园招聘)---最详细的解答

//两个for循环,只是为了寻找到另一个与x配对的y,这里犯傻了,y明明可以直接求出来,只要判断y是整数即可,所以改进后:


for(x=0; x < r; x++)

    y = sqrt(z - x*x);

    if(y == int (y) )//判断y是整数

        count = count + 4;

  

这样就变成了一个循环

优雅的点(2017网易校园招聘)---最详细的解答



所以,最后完整通过的代码是:

#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;
    }
    for(x = 1; x< r; x++)
    {
        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;
    }
    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;
}