• CSU 2018年12月月赛 A 2213: Physics Exam


    Description

    高中物理老师总认为给学生文本形式的问题比给纯计算形式的问题要求更高。毕竟,学生首先得阅读和理解问题。

    因此,他们描述一个问题不像”U=10V,I=5A,P=?”,而是”有一个含有U=10V 的电池组和灯泡的电路。现在有I=5A 的电流通过灯泡,问灯泡产生的功率是多少?”

    然而,大多数学生并不在乎题目文本。他们只是从文本中提取出:U=10V,I=5A。然后他们想:”我知道哪个公式呢?哦,对了,P=UI。因此P=10V5A=50W。搞定。”

    现在,我们只考虑一个P-U-I 类型的问题。即功率,电压和电流中的两个告诉你,你要求剩下那个。

    你的任务是写一个程序,从输入文件中读入一些文本问题,然后要你计算剩下那个的值。

    Input

    第一行为一个正整数,表示数据组数。

    每组数据包含一行,为一个包含两个数据区和一些任意单词的字符串。一个数据区具有如下形式:I=xA,U=xV 或P=xW,x 是一个实数。在A,V,W 之前有可能出现前缀m(毫, 千分之一),k(千),M(兆,百万)。以下是几点关于输入的说明:

    1. 等号(‘=’)只会在数据区出现,不会在其他地方出现;

    2. 数据区内没有空格字符;

    3. P 和U,P 和I,或U 和I 中的一个会给出;

    文本问题长度不超过255,且数据组数不超过3 组。

    Output

    对于每组数据输出一行,形式如:P=xW,I=xA 或U=xV(取决于输入数据),x 为一个实数,保留两位小数。在A,V,W 前不要出现前缀。

    Sample Input

    3 
    If the voltage is U=200V and the current is I=4.5A, which power is generated? 
    A light-bulb yields P=100W and the voltage is U=220V. Compute the current, please. 
    bla bla bla lightning strike I=2A bla bla bla P=2.5MW bla bla voltage? 
    

    Sample Output

    P=900.00W 
    I=0.45A 
    U=1250000.00V 

    题意:模拟题,但是要注意的是如何读入字符串文本,而且要注意的是这个数可能是小数,而且后缀的单位也不一定,需要统一一下。具体的细节可以看下代码。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <math.h>
    #include <set>
    using namespace std;
    const int maxn=230;
    int n,x,temp;
    string s;
    int main()
    {
        scanf("%d ",&n);//注意要在后加一个空格,不然getline在读入下一行的时候,会把那个换行字符读进去
        while(n--)
        {
            double P=0,U=0,I=0;
            getline(cin,s);
            int len=s.length();
    //        cout<<len<<endl;
            for(int i=0;i<len;i++)
            {
                if(s[i]=='=')
                {
                    if(s[i-1]=='U')
                    {
                        int j=i+1;
                        int pos=0;
                        while(j<len)//找到这个数到哪结束,然后方便我们把其转换为数字
                        {
                            if(s[j]>='0'&&s[j]<='9')
                            {
                                j++;
                            }
                            else if(s[j]=='.')//确定这个数是否为小数,记录下小数点的位置
                            {
                                pos=j;
                                j++;
                            }
                            else
                                break;
                        }
    //                    cout<<j<<endl;
                        int cnt=0;
                        if(pos==0)//是整数
                        {
                            for(int k=j-1;k>i;k--)
                            {
                                U+=((s[k]-'0')*(pow(10,cnt++)));
                            }
                        }
                        else
                        {
                            for(int k=pos-1;k>i;k--)
                                U+=((s[k]-'0')*(pow(10,cnt++)));
                            cnt=1;//cnt要重置一下
                            for(int k=pos+1;k<j;k++)
                                U+=((s[k]-'0')/(pow(10,cnt++)));
                        }
                        if(s[j]=='m')//判断后面的单位问题,后面同理操作。
                            U/=1000;
                        else if(s[j]=='M')
                            U*=1000000;
                        else if(s[j]=='k')
                            U*=1000;
    //                    cout<<U<<endl;
                    }
    
                    if(s[i-1]=='P')
                    {
                        int j=i+1;int pos=0;
                        while(j<len)
                        {
                            if(s[j]>='0'&&s[j]<='9')
                            {
                                j++;
                            }
                            else if(s[j]=='.')
                            {
                                pos=j;
                                j++;
                            }
                            else
                                break;
                        }
                        int cnt=0;
                        if(pos==0)
                        {
                            for(int k=j-1;k>i;k--)
                            {
                                P+=((s[k]-'0')*(pow(10,cnt++)));
                            }
                        }
                        else
                        {
                            for(int k=pos-1;k>i;k--)
                                P+=((s[k]-'0')*(pow(10,cnt++)));
                            cnt=1;
                            for(int k=pos+1;k<j;k++)
                                P+=((s[k]-'0')/(pow(10,cnt++)));
                        }
                        if(s[j]=='m')
                            P/=1000;
                        else if(s[j]=='M')
                            P*=1000000;
                        else if(s[j]=='k')
                            P*=1000;
    //                    cout<<P<<endl;
                    }
                    if(s[i-1]=='I')
                    {
                        int j=i+1;
                        int pos=0;
                        while(j<len)
                        {
                            if(s[j]>='0'&&s[j]<='9')
                            {
                                j++;
                            }
                            else if(s[j]=='.')
                            {
                                pos=j;
                                j++;
                            }
                            else
                                break;
                        }
                        int cnt=0;
                        if(pos==0)
                        {
                            for(int k=j-1;k>i;k--)
                            {
                                I+=((s[k]-'0')*(pow(10,cnt++)));
                            }
                        }
                        else
                        {
                            for(int k=pos-1;k>i;k--)
                                I+=((s[k]-'0')*(pow(10,cnt++)));
                            cnt=1;
                            for(int k=pos+1;k<j;k++)
                                I+=((s[k]-'0')/(pow(10,cnt++)));
                        }
                        if(s[j]=='m')
                            I/=1000;
                        else if(s[j]=='M')
                            I*=1000000;
                        else if(s[j]=='k')
                            I*=1000;
    //                    cout<<I<<endl;
                    }
                }
            }
            if(P==0)
            {
                printf("P=%.2fW
    ",U*I);
            }
            else if(U==0)
            {
                printf("U=%.2fV
    ",P/I);
            }
            else
            {
                printf("I=%.2fA
    ",P/U);
            }
        }
        return 0;
    }
    
    /**********************************************************************
        Problem: 2213
        User: therang
        Language: C++
        Result: AC
        Time:0 ms
        Memory:2212 kb
    **********************************************************************/
  • 相关阅读:
    k8镜像
    幂等设计
    复杂思考,简单设计。 https://mp.weixin.qq.com/s/xmkFzEpzIauJgus3MMmkaQ
    GDP Streaming RPC 设计
    The zero value for a Mutex is an unlocked mutex. 零值
    reflect.DeepEqual 反射 比较值相等
    Go 和 C 的变量定义异同 nil 值判断 汇编
    https://www.luogu.com.cn/blog/wangrx/finitecalculus
    HTML a标签链接 设置点击下载文件 react 路由 静态路由 动态路由 虚拟路由
    Mars 微信跨平台跨业务基础组件
  • 原文地址:https://www.cnblogs.com/jkzr/p/10163589.html
Copyright © 2020-2023  润新知