1. 程式人生 > >網易筆試題——優雅的點

網易筆試題——優雅的點

題目

小易有一個圓心在座標原點的圓,小易知道圓的半徑的平方。小易認為在圓上的點而且橫縱座標都是整數的點是優雅的,小易現在想尋找一個演算法計算出優雅的點的個數,請你來幫幫他。
例如:半徑的平方如果為25
優雅的點就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個點。

輸入輸出樣例

輸入

輸入為一個整數,即為圓半徑的平方,範圍在32位int範圍內。

25

輸出

輸出為一個整數,即為優雅的點的個數

12

分析

將圓分為四個部分,單個部分的點乘以4即所有點,需要注意的是x/y軸上的點,特殊處理
各個部分點計算,用下面方法求點
y = sqrt(半徑平方 - x ^ 2)
由於隱式型別轉換,只有開方的數剛好是整數,才會出現x ^ 2 + y ^ 2 == 半徑平方,說明點為優雅點

程式碼

#define _CRT_SECURE_NO_WARNINGS 1
//小易有一個圓心在座標原點的圓,小易知道圓的半徑的平方。
//小易認為在圓上的點而且橫縱座標都是整數的點是優雅的,小易現在想尋找一個演算法計算出優雅的點的個數,請你來幫幫他。
//例如:半徑的平方如果為25
//優雅的點就有:(+/ -3, +/ -4), (+/ -4, +/ -3), (0, +/ -5) (+/ -5, 0),一共12個點。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
	int num = 0;
	while
(cin >> num) { int count = 0; int r = sqrt(num);//求最大的整數半徑 <= 半徑 for (int i = 0; i <= r; i++) { //統計四分之一扇區點個數 //已知點的橫座標,求點的另一個整數 int tmp = sqrt(num - pow(i, 2)); //如果兩數平方相加等於原數,此點滿足條件 if (pow(i, 2) + pow(tmp, 2) == num) count++; } //由於計算的時候是從0統計到半徑所有點,因此x/y軸有點的話 //是重複統計了的,所以-1
if ((double)r == sqrt(num)) count--; //四分之一扇區乘4 == 所有點 cout << count * 4 << endl; } return 0; }