标题:点到原点的距离问题
只看楼主
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
结帖率:100%
 问题点数:0 回复次数:16 
点到原点的距离问题
题目如下:利用随机函数定义10对(x,y)值,存入一个数组中,按与原点(0,0)的距离由小到大的顺序输出所有的点及其到原点的距离。
下面是我的程序,虽然能得出结果,但自己感觉并不太好,有没有什么好的算法或者解法呢。

public class Point1Test
{
    public static void main(String [] args)
    {
        int [][] a=new int[10][2];
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<2;j++)
            {
                a[i][j]=(int)(Math.random()*10);
            }
        }
        for(int i=0;i<10;i++)  //输出10对(x,y)值
        {
            for(int j=0;j<2;j++)
            {
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }        
        double [] b=new double[10];
        for(int i=0;i<10;i++)
        {
            b[i]=Math.sqrt(a[i][0]*a[i][0]+a[i][1]*a[i][1]);  //计算每个点到原点的距离
        }
        for(int i=0;i<9;i++)
        {
            for(int j=i+1;j<10;j++)
            {
                if(b[i]>b[j])
                {
                    double temp=b[i]; //通过到原点距离的长短来调整每个点的位置
                    b[i]=b[j];
                    b[j]=temp;
                    int temp1=a[i][0];
                    int temp2=a[i][1];
                    a[i][0]=a[j][0];
                    a[i][1]=a[j][1];
                    a[j][0]=temp1;
                    a[j][1]=temp2;
                }
            }
        }
        System.out.println();
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<2;j++)
            {
                System.out.print(a[i][j]+" ");  // 按由小到大顺序输出每个点到原点的距离和此点的坐标        
            }                                       
            System.out.print(b[i]+" ");            
            System.out.println();
        }                
    }
}
搜索更多相关主题的帖子: 原点 距离 
2008-11-09 15:08
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
得分:0 
用一个类来存坐标是不是更方便一点呢!
2008-11-09 17:51
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
得分:0 
能说更仔细点不,怎么存我不知道
2008-11-09 19:21
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
得分:0 
简单的写了一下
程序代码:
import static java.lang.Math.*;
import java.util.Arrays;
import java.util.Collections;
import java. java.util.List;
public class Distence {
    private Dot[] dot = new Dot[10];
    
    /**
     * @author Administrator
     * 内部类,Dot用来存储点坐标
     *
     */
    private class Dot{
        private int x;
        private int y;
        private double distance;
        
        public Dot(){
            x = (int)(random() * 1000);
            y = (int)(random() * 1000);
            distance = hypot(x,y);  //即sqrt(x2 +y2)
        }
        
        public double getDistance(){
            return distance;
        }
        public String toString(){
            return "(" + x + "," + y + "),距原点的距离为:" + distance;
        }
    }
    
    public void createDots(){
        for(int i=0; i<dot.length; i++){
            dot[i] = new Dot();
        }
    }
    
    public void printDotList(){
        for(Dot d:dot){
            System.out.println(d);
        }
    }
    
    public void sort(){
        List<Dot> list = (List<Dot>)Arrays.asList(dot);
        Collections.sort(list, 
                new Comparator<Dot>(){
            public int compare(Dot dot1,Dot dot2){
                //因为返回的是int,所以当两个点到原点的距离相差不到1的时候可能会出现排序问题
                //当随机数取得越大的时候,这种情况出现的概率越小
                                     //可以再用快速排序或是冒泡排一下,因为已经排过一次了,所以会很快。或是直接冒泡、快排
                return (int)(dot1.getDistance()-dot2.getDistance()); 
            }
        });
    }
    
    public static void main(String[] args) {
        Distence dis = new Distence();
        dis.createDots();
        System.out.println("排序前:");
        dis.printDotList();
        dis.sort();
        System.out.println("排序后:");
        dis.printDotList();
    }
}


[[it] 本帖最后由 freish 于 2008-11-12 20:45 编辑 [/it]]
2008-11-09 22:00
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
得分:0 
先down下来,回去慢慢研究
...
2008-11-11 17:52
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
得分:0 
基本上明白了
就那个 for(Dot d:dot)语句还不明白,请解释下
2008-11-11 18:34
zhoutao_1001
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-9-1
得分:0 
import static java.lang.System.out;
import static java.util.Arrays.sort;
import java.lang.Math.*;
public class ydjl
{
  public static void main(String[] args)
  {
    int[][] a=new int[10][2];
    double[] b=new double[10];
    for(int i=0;i<10;i++)
    {
      a[i][0]=(int)(Math.random()*10);
      a[i][1]=(int)(Math.random()*10);
      b[i]=Math.sqrt(a[i][0]*a[i][0]+a[i][1]*a[i][1]);
    }
    sort(b);
    for(int i=0;i<10;i++)
    {
      out.printf("点:(%d,%d)距原点距离为:%f\n",a[i][0],a[i][1],b[i]);
    }
  }
}
2008-11-12 19:50
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
得分:0 
[bo][un]hwpayg[/un] 在 2008-11-11 18:34 的发言:[/bo]

基本上明白了
就那个 for(Dot d:dot)语句还不明白,请解释下


就是遍历数组dot,把当前对象赋给d
2008-11-12 20:45
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
得分:0 
[bo][un]zhoutao_1001[/un] 在 2008-11-12 19:50 的发言:[/bo]

import static java.lang.System.out;
import static java.util.Arrays.sort;
import java.lang.Math.*;
public class ydjl
{
  public static void main(String[] args)
  {
    int[][] a=new int[10][2];
 ...

你这程序是行不通的
2008-11-12 23:36
hwpayg
Rank: 2
等 级:论坛游民
帖 子:108
专家分:25
注 册:2008-4-3
得分:0 
import static java.lang.Math.*;
java.lang包不是自动导入吗?为啥还要引入java.lang.Math.*;还有前面加个static有什么特殊作用
2008-11-12 23:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-243212-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024327 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved