[牛客网] 优雅的点

牛客网-优雅的点


小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。

输入描述:

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

输出描述:

输出为一个整数,即为优雅的点的个数

输入例子:

25

输出例子:

12


重要case:
input output
25 12
65 16
85 16
425 24
204864885 32 //方法1错了
16 4 // 方法2错了,在没有质数的情况下,怎么处理


//1st submit
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int totalElegantPoints1(int r2){
	int total = 0;
	int r = sqrt(r2);
	int mid = sqrt(r2 / 2.0);

	if (r*r == r2) total += 4;
	if (2*mid*mid == r2) total += 4;
	for (int i = mid + 1; i < ceil(sqrt(r2)); ++i){
		int j = sqrt(r2 - i*i);		
		if (i*i + j*j == r2)  {
			total += 8;
			cout << i << ' ' << j << endl;
		}
	}
	return total;
}

bool isPrime(int n, int f1){
	for (int i = f1; i <= sqrt(n); i++)
		if (n%i == 0) return false;
	return true;
}

void getOneFactor(int &n, int &f1, int &f1_num){
	int f;
	for (int i = f1; i <= sqrt(n); i += 2){
		// without 2, only consider odd factors
		if (n % i == 0){
			f1 = i;
			do{
				f1_num++;
				n /= f1;
			} while (n % f1 == 0);
			break;
		}
	}
}

void getFactors(int n, vector<int>& v1, vector<int>& v2, int factor1){
	if (isPrime(n, factor1)){
		if (n % 4 == 1) v1.push_back(1);
		if (n % 4 == 3) v2.push_back(1);
		return;
	}

	int f1 = factor1, f1_num = 0; 
	getOneFactor(n, f1, f1_num);
	if (f1 % 4 == 1) v1.push_back(f1_num);
	if (f1 % 4 == 3) v2.push_back(f1_num);
	if (1 == n) return;//first version
	getFactors(n, v1, v2, f1);
}

int totalElegantPoints2(int n){
	vector<int> vf41;// f41: factors (f mod 4 == 1)
	vector<int> vf43;// f43: factors (f mod 4 == 3)
	int pair_num;	 // number of int pairs
	while (n % 2 == 0) n /= 2; // preprocess: drop 2	
	getFactors(n, vf41, vf43, 3);// update f41 and f43
	
	// traverse f43, if any element is odd, return 0
	for (vector<int>::iterator iter = vf43.begin(); iter != vf43.end(); iter++)
		if (*iter % 2 == 1) return 0;	

	// compute int pair number
	pair_num = 4;
	for (vector<int>::iterator iter = vf41.begin(); iter != vf41.end(); iter++)
		pair_num *= *iter + 1;
	
	return pair_num;
}

int main() {
	int r2;
	while (cin >> r2)
		cout << totalElegantPoints2(r2) << endl;
	return 0;
}
// failure case: 204864885

failure case:
16 4
分析:s==0


// 2nd submit
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

bool isPrime(int n, int f1){
	for (int i = f1; i <= sqrt(n); i++)
		if (n%i == 0) return false;
	return true;
}

void getOneFactor(int &n, int &f1, int &f1_num){
	int f;
	for (int i = f1; i <= sqrt(n); i += 2){// without 2, only consider odd factors
		if (n % i == 0){
			f1 = i;
			do{
				f1_num++;
				n /= f1;
			} while (n % f1 == 0);
			break;
		}
	}
}

void getFactors(int n, vector<int>& v1, vector<int>& v2, int factor1){
	if (1 == n) return;
	if (isPrime(n, factor1)){
		if (n % 4 == 1) v1.push_back(1);
		if (n % 4 == 3) v2.push_back(1);
		return;
	}

	int f1 = factor1, f1_num = 0; //
	getOneFactor(n, f1, f1_num);
	if (f1 % 4 == 1) v1.push_back(f1_num);
	if (f1 % 4 == 3) v2.push_back(f1_num);
	
	getFactors(n, v1, v2, f1);
}

int totalElegantPoints2(int n){
	vector<int> vf41;// f41: factors (f mod 4 == 1)
	vector<int> vf43;// f43: factors (f mod 4 == 3)
	int pair_num;	 // number of int pairs
	while (n % 2 == 0) n /= 2; // preprocess: drop 2	
	getFactors(n, vf41, vf43, 3);// update f41 and f43
	
	// traverse f43, if any element is odd, return 0
	for (vector<int>::iterator iter = vf43.begin(); iter != vf43.end(); iter++)
		if (*iter % 2 == 1) return 0;	

	// compute int pair number
	pair_num = 4;
	for (vector<int>::iterator iter = vf41.begin(); iter != vf41.end(); iter++)
		pair_num *= *iter + 1;
	
	return pair_num;
}

int main() {
	int r2;
	cin >> r2;
	cout << totalElegantPoints2(r2) << endl;
	return 0;
}

totalElegantPoints2
提交时间:2018-05-20 语言:C++ 运行时间: 5 ms 占用内存:480K 状态:答案正确

表现并没有更好,为什么呢?

不可靠的sqrt

问题: n = r 2 n={r}^2 ,判断r是不是整数。

思路一: if(r == int®)

思路二: if( n = = r 2 n=={r}^2 )

失败:$n=85137521, r=9227.00000(float类型)$

猜你喜欢

转载自blog.csdn.net/cp_oldy/article/details/88286115
今日推荐