編程之美初賽-焦距(2014.4.19)

時間限制: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

題目不是很難,字符串匹配問題。
#include <iostream>
#include <cstdlib>
#include "stdio.h"
#include <string>
using namespace std;
double change(string p){
 int n=p.size();
 double dcvalue;
 if(p[n-2]=='d'){
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue*100;
 }else if (p[n-2]=='c')
 {
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue*10;
 }else if (p[n-1]=='m'&&p[n-2]=='m'){
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue;
 }else if (p[n-2]=='u'){
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue/1000;
 }else if (p[n-2]=='n')
 {
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue/1000000;
 }else if('0'<=p[n-2]&&p[n-2]<='9'){
  p.erase(n-1,1);
  dcvalue=atof(p.c_str());
  return dcvalue*1000;
 }else if(p[n-1]=='x'){
  p.erase(n-2,2);
  dcvalue=atof(p.c_str());
  return dcvalue;
 }
}
int main(){
    int m;
 cin>>m;
 int i=1;
 string str1,str2,str3;
 while(m>0){
  cin>>str1;
  cin>>str2;
  cin>>str3;
  double dstr1=change(str1);
  double dstr2=change(str2);
  double dstr3=change(str3);
  double ans=dstr1*dstr3/dstr2;
  cout<<"Case ";
  cout<<i;
  cout<<": ";
  cout<<ans;
  cout<<"px";
  cout<<endl;
  i++;
  m--;
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章