網易筆試題——優雅的點
阿新 • • 發佈:2019-02-17
題目
小易有一個圓心在座標原點的圓,小易知道圓的半徑的平方。小易認為在圓上的點而且橫縱座標都是整數的點是優雅的,小易現在想尋找一個演算法計算出優雅的點的個數,請你來幫幫他。
例如:半徑的平方如果為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;
}