• 2014微软编程之美预赛第一 焦距


    题目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
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<cmath>
    using namespace std;
    double jinwei(string a)
    {
        int len=a.size();
        double h=0;
        if(a[len-2]=='c')
        {
            h=10;
        }
        else if(a[len-2]=='d')
        {
            h=100;
        }
        else if(a[len-2]=='u')
        {
            h=0.001;
        }
        else if(a[len-2]=='n')
        {
            h=0.000001;
        }
        else if(a[len-2]=='m'||a[len-2]=='p')
        {
            h=1;
        }
        else
        {
            h=1000;
        }
        return h;
    }
    double change(string a)
    {
    
        char s[1010];
        int k=0;
        double h=jinwei(a);
        for(int i=0;i<a.size();i++)
        {
            if(a[i]>='a'&&a[i]<='z')
                break;
            s[k++]=a[i];
        }
        s[k]='';
        double sum=0;
        sum=atof(s);
        sum*=h;
        return sum;
    }
    
    int main()
    {
        int t;
        while(cin>>t)
        {
            for(int k=1;k<=t;k++)
            {
                string a,b,c;
                cin>>a>>b>>c;
                double v1,v2,v3;
                v1=change(a);
                v2=change(b);
                v3=change(c);
              //  cout<<v1<<" "<<v2<<" "<<v3<<endl;
                double sum=v3*v1/v2;
                int s=sum*100+0.5;
                cout<<"Case "<<k<<": ";
                printf("%.2lfpx
    ",(double)s/100);
            }
        }
        return 0;
    }
    

    //水的问题可以很容易误事

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业*
    #**第八周作业+预习作业**
    第七周作业
    Linux 日志查看常用命令
    Linux tar命令
    Java 数组
    设计模式 观察者模式(Observer)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4677439.html
Copyright © 2020-2023  润新知