编程之美(初赛第一场)

P1 : 焦距

一般來說,我們採用針孔相機模型,也就是認為它用到的是小孔成像原理。

在相機坐標系下,一般來說,我們用到的單位長度,不是「米」這樣的國際單位,而是相鄰圖元的長度。而焦距在相機坐標系中的大小,是在影像處理領域的一個非常重要的物理量。

假設我們已經根據相機參數,得到鏡頭的物理焦距大小(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

現在,請您寫一段通用的程式,來求解焦距在相機坐標系中的大小。

第一题,一看很简单。我打算只过小数据的,但是还是错,后来才知道我在格式控制符中printf(".2f",  ans+0.005);导致一直错啊,错的我真是伤心。

后来经大神提醒,知道怎么输入了,准备过大数据。

总的来说还是编程水平太差了,输入输出错的一塌糊涂。

用了printf(".2f\n", ans);c语言自动帮你转换进行四舍五入,真的是错的一塌糊涂啊。弄得都不想搞了。。。

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

void get_data(double& f, char *fdata){
    if(strcmp(fdata, "m") == 0) f *= 1000;
    else if(strcmp(fdata, "dm") == 0) f *= 100;
    else if(strcmp(fdata, "cm") == 0) f *= 10;
    else if(strcmp(fdata, "mm") == 0) f *= 1;
    else if(strcmp(fdata, "um") == 0) f *= 0.001;
    else if(strcmp(fdata, "nm") == 0) f *= 0.000001;
}

int main()
{
  int t;
  char fdata[1000], cdata[100], idata[100];
  double f, c, i;
  scanf("%d", &t);
  for(int test = 1; test <= t; test ++){
      memset(fdata, 0, sizeof(fdata));
      memset(cdata, 0, sizeof(cdata));
      scanf("%lf%s", &f, fdata);
      scanf("%lf%s", &c, cdata);
      scanf("%lf%s", &i, idata);
      //printf("%lf %lf %lf\n", f, c, i);
      //cout << fdata << cdata << endl;
      get_data(f, fdata);
      get_data(c, cdata);

      //printf("%lf %lf %lf\n", f, c, i);
      double ans = (((double)i)*(double)f/(double)c);
      printf("Case %d: %.2fpx\n", test, ans);
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值