首页 > 试题广场 >

优雅的点

[编程题]优雅的点
  • 热度指数:36402 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。

输入描述:
输入为一个整数,即为圆半径的平方,范围在32位int范围内。


输出描述:
输出为一个整数,即为优雅的点的个数
示例1

输入

25

输出

12
#include<iostream>
#include<cmath>
using namespace std;
int main() {
    int n;
    cin>>n;
    int count = 0;
    int r = (int)sqrt(n);
    if (r*r == n) {
        count += 4;
        --r;
    }
    for (int i = r; i > 0; i--) {
        int x = (int)sqrt(n - i*i);
        if(x*x + i*i == n) count += 4;
    }
    cout<<count<<endl;
}
发表于 2017-02-19 17:14:26 回复(1)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(count(n));
    }
    
    public static int count(int n) {
        int count = 0;
        double r = Math.sqrt(n);
        for (int i = 0; i < r; i++) {
            double j = Math.sqrt(n - i * i);
            if (Math.abs(j - Math.round(j)) <= 0.000000001) {
                count++;
            }
        }
        return 4 * count; 
    } 
}

编辑于 2017-01-18 14:59:26 回复(2)
#include<stdio.h>
#include<math.h>
int main(){
    for(int N=0;scanf("%d",&N)!=EOF;){
        int res=0;
        for(int i=0;i<sqrt(N);i++)
            (int)sqrt(N-i*i)==sqrt(N-i*i)?res++:res=res;
        printf("%d\n",4*res);
    }
}//圆的方程:x^2+y^2=r^2
 //那么y=sqrt(r^2-x^2)
 //在判断y是不是整数

发表于 2017-08-30 14:55:35 回复(1)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int rSquare = in.nextInt();
        int count =0;
        double r = Math.sqrt(rSquare);

        //存储值
        for(int i=0;i<r;i++){
            /*运行超时
            for(int j=1;j<r+1;j++){
                if(i*i+j*j==rSquare){
                    count++;
                }
            }
            */
//优化点1
            double j = Math.sqrt(rSquare-i*i);
            if((int) j==j){
                count++;
            }
        }
        
        //优化点2
        System.out.print(count<<2);
        
    }
}

发表于 2016-09-16 11:37:04 回复(6)
//选第一象限,判断i是整数的时候,j是不是整数就行了
//此处把double强制转换为int,如果有小数点,那么转换后就是变小了

//需要注意的是,double仅能在一定范围内(正负2^53)精确的表示整数
//如果超过这个范围,就不是精确的,此时用 == 比较是不正确的
//本题输入是int,所以可以这么做
#include <iostream>
#include <math.h>
using namespace std;
int main(){
    int n = 0;
    while(cin >> n){
        int res = 0;
        for( int i = 0; i < sqrt(n); i++ ){
            double j = sqrt(n - i*i);
            if( (int)j >= j )
                res++;
        }
        cout<<4*res<<endl;
    }
}

编辑于 2016-09-13 14:56:12 回复(6)
python:在半径 的范围内 寻找,如果 有一个 数字为 0则总数+2,否则加4,不知道为什么 提示 超时?
from math import sqrt

def nCouple(N):
    r=int(sqrt(N))
    count=0
    for i in range(r+1):
        j=sqrt(N-i**2)
        if j in range(r+1) :
            if i==0 or j==0:
                count+=2
            else:
                count+=4
    return count
if __name__=='__main__':
    n=int(input())
    print(nCouple(n))


编辑于 2017-10-20 16:46:52 回复(2)

python solution:

from math import sqrt


def countGracePoint(number):
    squareSet = set()
    for i in range(int(sqrt(number)) + 1):
        squareSet.add(i ** 2)
    res = 0
    for i in range(int(sqrt(number)) + 1):
        if number - i ** 2 in squareSet:
            if i != 0 and number - i ** 2 != 0:
                res += 4
            else:
                res += 2
    return res


a = int(input())
print(countGracePoint(a))
发表于 2018-04-12 15:35:16 回复(1)
try:
    while True:
        num = int(input())
        result = 0
        for i in range(1,int(num**0.5)+1):
            a = int((num-i*i)**0.5)
            if a*a+i*i == num:
                result += 4
        print(result)
except Exception:
    pass
编辑于 2018-11-14 11:04:11 回复(0)
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
 
publicclassMain {
 
    publicstaticvoidmain(String[] args) throwsNumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader read = newBufferedReader(newInputStreamReader(System.in));
        doubler2 = Integer.parseInt(read.readLine());
        doubler = Math.sqrt(r2);
        f(r2);
    }
 
    publicstaticvoidf(doubler2) {
        intcount = 0;
        for(intx = 0; x < Math.sqrt(r2); x++) {
            doubley = Math.sqrt(r2 - x * x);
            if((int) y == y) {
                count += 4;
            }
        }
        System.out.print(count);
    }
}

发表于 2018-10-11 17:42:54 回复(0)
r_2=int(input())
r=int(r_2**0.5)

if r==r_2**0.5:
    count=-2
else:count=0
for i in range(-r,r+1):
    if (r_2-i**2)**0.5==int((r_2-i**2)**0.5):
            count+=2
print(count)


发表于 2018-05-28 10:14:48 回复(0)
// 判断是否为整数,使用double类型保证精度
bool isInt(double y)

{

    double a = y - (int)y;

    if(a==0)

        return 1;

    else

        return 0;

}


void elegantPoint()

{

    int rSquare;

    cin >> rSquare;

    int result = 0;

    double r = sqrt(rSquare);
    // 求第一象限满足要求的点,乘以4得到所有象限满足要求的点的个数

    for(int x=1; x*x<rSquare; x++)

    {

        double y = sqrt(rSquare-x*x);

        if(isInt(y))

        {

            result+=4;

        }

    }
    // 判断X轴和y轴上的点是否满足整数条件,若满足则加上4个点

    if(isInt(r))

    {

        result+=4;

    }

    cout << result;

}


发表于 2018-03-13 22:11:15 回复(0)
bool isInt(double x) { 

    double a = x - (int) x;

    if(a==0) return 1;

    else return 0;

}

int main(){

    int radius;

    int cnt = 0;;

    while(cin >> radius){

        for(int i=1; i<= sqrt(radius); i++){

            if (isInt(sqrt(radius - i*i)))

                cnt++;

           }

        cout << 4*cnt << endl;

        }

    return 0;
}
一开始用float类型通不过,换成double就可以了。原来题目上写了32位精度,不够细心。
发表于 2018-03-13 22:02:06 回复(0)
#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int r2,cnt=0;
	cin>>r2;
	for(int x=0;x<=sqrt(r2/2);x++){
		double y=sqrt(r2-x*x);
		if((int)y==y){
			(x==0||x==y)?cnt+=4:cnt+=8;
		}
	}
	cout<<cnt;
	return 0;
}

发表于 2017-08-25 14:50:41 回复(1)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
while(s.hasNext()){
int num =0;
            int eq = 0;
int sq = s.nextInt();
int r = (int)Math.sqrt(sq);
            int i=1;
int j=r;
int sum=0;
while(i<=j){
sum = i*i+j*j;
if(sum>sq){
j--;
}else if(sum<sq){
i++;
}else{
                    if(i == j){
                        ++eq;
                        break;
                    }
num++;
i++;
j--;
}
}
            if(r*r==sq){
++eq;
}
            int total = num*8+eq*4;                         
System.out.println(total);
}
}
}

编辑于 2016-09-13 22:44:55 回复(0)
思路很简单,先求得半径r,然后将0~r之间整数的平方全部用集合存起来方便查找。如果半径r是一个整数,那么可以得到(0,+/-r)和(+/-r,0)4个优雅点,否则就得不到端点处的这4个优雅点。然后检查 1~不超过r的最大整数x 能不能使得“r的平方-x的平方”为某一整数y的平方,如果可以满足,就又可以得到(+/-x,+/-y)4个优雅点。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int r2 = Integer.parseInt(br.readLine());
        double r = Math.sqrt(r2);     // 半径
        HashSet<Integer> set = new HashSet<>();
        int count = ((int)r)*((int)r) == r2? 4: 0;
        for(int x = 0; x <= (int)r; x++) set.add(x*x);      // 先将0~r中整数的平方存储起来便于之后查找
        for(int x = 1; x < r; x++)
            if(set.contains(r2 - x*x)) count += 4;      // 满足勾股数,计数自增4
        System.out.println(count);
    }
}

发表于 2021-04-04 18:03:34 回复(0)
import java.util.Scanner;

public class Main11 {
    public static void main(String[] args) {
        Scanner sr =new Scanner(System.in);
        while (sr.hasNext()){
            int res=0;
            int c=sr.nextInt();
            int cc=(int)Math.sqrt(c);
            for (int i=cc;i>0;i--){
                if(Math.pow(c-Math.pow(i,2),0.5)%1==0){//a²=c²-b²,对a²开根,为整数时res++
                    res++;
                }
            }
            System.out.println(res*4);
        }
    }
}

编辑于 2020-06-19 13:59:26 回复(0)
c++  卡90好像是 因为 int 精度不够,最后 i*i+j*j-n=-488888888什么的竟然为true.把 int全换double后就通过了
发表于 2019-08-07 10:08:07 回复(0)
#include <iostream>
#include <math.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int q=sqrt(n);
    int res=0;
    for(int i=1;i<=q;i++){
        int temp=sqrt(n-pow(i,2));
        if(pow(i,2)+pow(temp,2)==n)
            res+=4;
    }
    cout<<res<<endl;
    return 0;
}
发表于 2018-09-25 11:09:58 回复(0)
import math
n = int(input())

def graceful_point(n):
    b = 0
    for i in range(-1*int(math.sqrt(n)), 0):
        if math.sqrt(n-i*i) % 1 == 0:
            b += 4
    return b

print(graceful_point(n))
非常简单的方法,循环的时候不要把等于0 的情况包含,即
range(-1*int(math.sqrt(n)), 0)
这样的话,等于0 的情况实际上4恰好融入其他情况中。
发表于 2018-09-08 09:51:22 回复(0)
发表于 2018-03-26 15:38:18 回复(0)

问题信息

难度:
195条回答 23951浏览

热门推荐

通过挑战的用户

查看代码