• 首页
  • 文章列表
  • 2014微软编程之美 初赛 试题1 焦距(答案含解题思路)
我这人吧,永远不要挑战我的底线,否则我又得修改底线。

2014微软编程之美 初赛 试题1 焦距(答案含解题思路)

描述
一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。

在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。

假设我们已经根据相机参数,得到镜头的物理焦距大小(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

思路:主要是单位的换算问题。换算的时候要注意把m放到最后进行检测,因为dm,cm.,mm,um,nm中都有m。还有不能溢出。用10的指数表示最好。

代码:


//source here
 #include <stdio.h>
 #include <math.h>
 #define SL 12 //string length
 float getValue(char str[SL])
 {
  int flag=0;
  int wei=0; 
  float value=0.0;
  int i=0;
  while(str[i]<='9'&&str>='0'||str[i]=='.')
  {
      if(str[i]=='.')
      {
       flag=1;
       wei=0;
       }
      else
      {
           if(flag)//有小数点
           {
                             wei--;
               value+=(str[i]-'0')*pow(10,wei);              
           }
           else//没有小数点
           {
                value=value*10+(str[i]-'0');              
           } 
      }
      i++;
                
   }
   return value;
 }
 int DW(char str[SL],char dw[SL])
 {
  int i=0;
  for(i=0;i<SL-1;i++)
  {
   if(str[i]==dw[0]&&str[i+1]==dw[1])
   return 1;
  }
  return 0;
 }
 int main()
 {
     int tt,T ;
     char strImage[SL];
     char strFocal[SL];
     char strCCD[SL];
     float Image;
     float Focal;
     float CCD;
     float result;
     int i=0;
     int danwei=0;
     int danwei1=0;
     scanf("%d",&T);
     tt=T;
     while(T--)
     {
               for(i=0;i<SL;i++)
               {
                strImage[i]=0;
                strFocal[i]=0;
                strCCD[i]=0;                              
               }
              
               scanf("%s %s %fpx",strFocal,strCCD,&Image);
               //printf("%s %s %fpx",strFocal,strCCD,&Image);
               
               Focal=0.0;
               CCD=0.0;
               //scanf("%f%s %f%s %fpx",&Focal,strFocal,&CCD,strCCD,&Image);
               //printf("%f%s %f%s %fpx",&Focal,strFocal,&CCD,strCCD,&Image);
               CCD=getValue(strCCD);
               Focal=getValue(strFocal);
               //一毫秒为单位 
               danwei=0;
               if(DW(strFocal,"mm"))
               {
                danwei=0;
               }
               else if(DW(strFocal,"dm"))
               {
                danwei=2;
               }
               else if(DW(strFocal,"cm"))
               {
                danwei=1;
               }
               else if(DW(strFocal,"um"))
               {
                danwei=-3;
               }
               else if(DW(strFocal,"nm"))
               {
                danwei=-6;
               }else if(DW(strFocal,"m"))
               {
                danwei=3;
               }
              
              
              danwei1=0;
              if(DW(strCCD,"mm"))
               {
                danwei1=0;
               }
               else if(DW(strCCD,"dm"))
               {
                danwei1=2;
               }
               else if(DW(strCCD,"cm"))
               {
                danwei1=1;
               }
               else if(DW(strCCD,"um"))
               {
                danwei1=-3;
               }
               else if(DW(strCCD,"nm"))
               {
                danwei1=-6;
               }else if(DW(strCCD,"m"))
               {
                danwei1=3;
               }
               //printf("%d   %d \n",danwei,danwei1);
               //printf("%s %s %fpx",strFocal,strCCD,Image);
               //printf("%fmm %fmm %fpx",Focal,CCD,Image);
               result=(Image*Focal/CCD)*pow(10,(danwei-danwei1));
               printf("Case %d: %.2fpx\n",tt-T,result);
            
     }
 }

结果:2ms,内存占用31M


标签

最新评论