zoukankan      html  css  js  c++  java
  • 编程之美初赛-焦距

    题目1 焦距
    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB
    描写叙述
          一般来说,我们採用针孔相机模型,也就是觉得它用到的是小孔成像原理。在相机坐标系下。一般来说,我们用到的单位长度,不是“米”这种国际单位,而是相邻像素的长度。

    而焦距在相机坐标系中的大小。是在图像处理领域的一个很重要的物理量。如果我们已经依据相机參数。得到镜头的物理焦距大小(focal length)。和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则详细计算公式为:Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)比方说对于Canon PowerShot S100, 带入公式得Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels,如今。请您写一段通用的程序,来求解焦距在相机坐标系中的大小。

    输入
    多组測试数据。首先是一个正整数T,表示測试数据的组数。
    每组測试数据占一行,分别为镜头的物理焦距大小(focal length on earth),,相机胶片的宽度(CCD width on earth),照片的横向分辨率大小(image width in pixels),单位为px。

    之间用一个空格分隔。


    输出
    每组数据输出一行,格式为“Case X: Ypx”。 X为測试数据的编号。从1開始。Y为焦距在相机坐标系中的大小(focallength in pixels),保留小数点后2位有效数字,四舍五入取整。


    数据范围
    对于小数据:focal length on earth和CCD width on earth单位都是毫米(mm)
    对于大数据:长度单位还可能为米(m), 分米(dm), 厘米(cm), 毫米(mm), 微米(um)。纳米(nm)


    例子输入

        2
        5.4mm   5.27mm    1600px
        5400um  0.00527m  1600px

    例子输出

        Case 1: 1639.47px
        Case 2: 1639.47px

    题解:

          本题求焦距,简单。没什么说的。注意可能出现的大数,我保险起见用了Java。结果费了非常多时间。只是也学了也谢BigDecimal的使用方法,得不偿失啊。好久没做题,感觉不太适应。

    import java.math.BigDecimal;
    import java.util.Scanner;
    
    
    public class Main{
    	
    
    	
    	public static void main(String[] str)
    	{
    		Scanner input=new Scanner(System.in);
    		BigDecimal nm=new BigDecimal("0.000000001");
    		BigDecimal um=new BigDecimal("0.000001");
    		BigDecimal mm=new BigDecimal("0.001");
    		BigDecimal cm=new BigDecimal("0.01");
    		BigDecimal dm=new BigDecimal("0.1");
    		String str1,str2,str3;
    		int tag=0;
    		int cas=input.nextInt();
    		while(--cas>=0)
    		{
    			str1=input.next();
    			str2=input.next();
    			str3=input.next();
    			BigDecimal a1,a2,a3,aa1,aa2;
    			if('n'==str1.charAt(str1.length()-2))
    			{
    				aa1=nm;
    				str1=str1.substring(0, str1.length()-2);
    			}
    			else if('u'==str1.charAt(str1.length()-2))
    			{
    				aa1=um;
    				str1=str1.substring(0, str1.length()-2);
    			}
    			else if('m'==str1.charAt(str1.length()-2))
    			{
    				aa1=um;
    				str1=str1.substring(0, str1.length()-2);
    			}
    			else if('c'==str1.charAt(str1.length()-2))
    			{
    				aa1=um;
    				str1=str1.substring(0, str1.length()-2);
    			}
    			else if('d'==str1.charAt(str1.length()-2))
    			{
    				aa1=um;
    				str1=str1.substring(0, str1.length()-2);
    			}
    			else 
    			{
    				aa1=new BigDecimal("1");
    				str1=str1.substring(0, str1.length()-1);
    			}
    			
    			if('n'==str2.charAt(str2.length()-2))
    			{
    				aa2=nm;
    				str2=str2.substring(0, str2.length()-2);
    			}
    			else if('u'==str2.charAt(str2.length()-2))
    			{
    				aa2=um;
    				str2=str2.substring(0, str2.length()-2);
    			}
    			else if('m'==str2.charAt(str2.length()-2))
    			{
    				aa2=um;
    				str2=str2.substring(0, str2.length()-2);
    			}
    			else if('c'==str2.charAt(str2.length()-2))
    			{
    				aa2=um;
    				str2=str2.substring(0, str2.length()-2);
    			}
    			else if('d'==str2.charAt(str2.length()-2))
    			{
    				aa2=um;
    				str2=str2.substring(0, str2.length()-2);
    			}
    			else 
    			{
    				aa2=new BigDecimal("1");
    				str2=str2.substring(0, str2.length()-1);
    			}
    			
    			str3=str3.substring(0,  str3.length()-2);
    			a1=new BigDecimal(str1);
    			a2=new BigDecimal(str2);
    			a3=new BigDecimal(str3);
    			a1=a1.multiply(aa1);
    			a2=a2.multiply(aa2);
    			//System.out.println(a1+"   "+a2+"   "+a3+"   ");
    			
    			BigDecimal ans=new BigDecimal("0");
    		    ans=ans.add(a3);
    		    ans=ans.multiply(a1);
    		    
    		  //  System.out.println(ans+"   "+a2);
    		    ans=ans.divide(a2,2);
    		    ans=ans.setScale(2, BigDecimal.ROUND_HALF_UP);
    		    tag++;
    		    System.out.println("Case "+tag+": "+ans+"px");
    			}	
    	}
    }


     

  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6853310.html
Copyright © 2011-2022 走看看