1. 程式人生 > >找優雅點(原點在圓心的圓上的整數點)

找優雅點(原點在圓心的圓上的整數點)


package Day31;
//圓的方程:x^2+y^2=r^2
//由於預設y=sqrt(r^2-x^2)是double型別
//在判斷y是不是整數
import java.util.*;
public class Test {

	/**
	 * @param args
	 */
	static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
  Scanner sc =new Scanner(System.in);
	int s = sc.nextInt();
	
	for(int x=(int)(-Math.sqrt(s));x<=Math.sqrt(s);x++)	
	{
		for(int y=(int)(-Math.sqrt(s));y<=Math.sqrt(s);y++)
	{
	if(x*x+y*y==s)
	{
		count++;
		// System.out.println(x+","+y);
	}
	}
	}
	System.out.println(count);
	}
	

}
//上述方法複雜度很高,下面是牛人的方法
package Day31;
import java.util.*;
//很聰明的解題思路,由於圓上除了原點特殊,其他都是關於x,y軸對稱,只要求得所有滿足條件的正的x,y然後乘以4即可,考慮原點的特殊性,而且一定有原點這點
//對於x,y的取值只取一頭就可以了

public class Test1{

	/**
	 * @param args
	 */
	static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
  Scanner sc =new Scanner(System.in);
	int s = sc.nextInt();
	for(int x=0;x<Math.sqrt(s);x++)//只考慮x=0,就行了。對於x,y的取值只取一頭就可以了
	{
		double y=Math.sqrt(s-x*x);
	if((int)y==y)
	{
		count++;
	//	System.out.println(x+","+y);
	}
	}
	// System.out.println(count);
	
	System.out.println(count<<2);//左移2相當於乘以4
	}

	}
	
//自己再次修改
package Day31;
import java.util.*;
//優化
//解題思路:由於圓上的點都是成對對稱的,除了在原點這一例外。
public class Test2{

	/**
	 * @param args
	 */
	static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
  Scanner sc =new Scanner(System.in);
	int s = sc.nextInt();
	for(int x=(int) -Math.sqrt(s);x<=(int)Math.sqrt(s);x++)	
	{
		double y=Math.sqrt(s-x*x);
		if((int)y==y)
	{
		count++;
		if(x==0)
		{
			count=count-1;
		}
		System.out.println(x+","+y);
	}
	}
	System.out.println(count*2);
	//System.out.println(count<<2);
	}

	}
	

有一個圓心在座標原點的圓,知道圓的半徑的平方,認為在圓上的點而且橫縱座標都是整數的點是優雅的,現在想尋找一個演算法計算出優雅的點的個數。