CSU 2018年12月月賽 A 2213: Physics Exam
阿新 • • 發佈:2018-12-23
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(兆,百萬)。以下是幾點關於輸入的說明:
-
等號(‘=’)只會在資料區出現,不會在其他地方出現;
-
資料區內沒有空格字元;
-
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\n",U*I);
}
else if(U==0)
{
printf("U=%.2fV\n",P/I);
}
else
{
printf("I=%.2fA\n",P/U);
}
}
return 0;
}
/**********************************************************************
Problem: 2213
User: therang
Language: C++
Result: AC
Time:0 ms
Memory:2212 kb
**********************************************************************/