这个题过不了的,https://www.udebug.com/UVa/537,欢乐的Debug去吧!
主要容易忽略的问题有:
1.忽略负数
2.M是兆要*1000000
3.m是毫要*0.001
下面是ac代码,太长了,我觉得也不会有人有耐心去看的,总之耐下性子来,好好Debug,这个题就能出来。
#include <bits/stdc++.h>
#include <cstdio>
#define me(x,y) memset(x,y,sizeof(x))
#define sd(x) scanf("%d",&x)
#define ss(x) scanf("%s",x)
#define sf(x) scanf("%f",&x)
#define slf(x) scanf("%lf",&x)
#define pd(x) printf("%d\n",x)
#define plld(x) printf("%lld\n",x)
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<y?x:y)
#define sum(x,y) (x+y)
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e4 + 5 ;
char s[maxn];
int n;
int main() {
sd(n);getchar();
for(int m=1;m<=n;m++) {
gets(s);
int flag1=0,flag2=0;
//printf("%s\n",s);
char *j = strstr(s,"P=");
printf("Problem #%d\n",m);
if(!j) {
//计算U
int k=strstr(s,"U=")-s;
k+=2;
if(s[k]=='-')flag1=1,k++;
double U=0,u=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
U=U*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
u+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
U+=u;
while(s[k]!='V') {
if(s[k]=='k'||s[k]=='K')U*=1000;
else if(s[k]=='M')U*=1000000;
else if(s[k]=='m')U*=0.001;
k++;
}
//计算I
k=strstr(s,"I=")-s;
k+=2;
if(s[k]=='-')flag2=1,k++;
double I=0,i=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
I=I*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
i+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
I+=i;
while(s[k]!='A') {
if(s[k]=='k'||s[k]=='K')I*=1000;
else if(s[k]=='M')I*=1000000;
else if(s[k]=='m')I*=0.001;
k++;
}
if(flag1)U*=-1;
if(flag2)I*=-1;
printf("P=%.2lfW\n\n",U*I);
continue;
}
j=strstr(s,"U=");
if(!j) {
//计算P
int k=strstr(s,"P=")-s;
k+=2;
if(s[k]=='-')flag1=1,k++;
double P=0,p=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
P=P*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
p+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
P+=p;
while(s[k]!='W') {
if(s[k]=='k'||s[k]=='K')P*=1000;
else if(s[k]=='M')P*=1000000;
else if(s[k]=='m')P*=0.001;
k++;
}
//计算I
k=strstr(s,"I=")-s;
k+=2;
if(s[k]=='-')flag2=1,k++;
double I=0,i=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
I=I*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
i+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
I+=i;
while(s[k]!='A') {
if(s[k]=='k'||s[k]=='K')I*=1000;
else if(s[k]=='M')I*=1000000;
else if(s[k]=='m')I*=0.001;
k++;
}
//printf("P=%.2lf I=%.2lf\n",P,I);
if(flag1)P*=-1;
if(flag2)I*=-1;
printf("U=%.2lfV\n\n",P/I);
continue;
}
j=strstr(s,"I=");
if(!j) {
//计算P
int k=strstr(s,"P=")-s;
k+=2;
if(s[k]=='-')flag1=1;
double P=0,p=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
P=P*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
p+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
P+=p;
while(s[k]!='W') {
if(s[k]=='k'||s[k]=='K')P*=1000;
else if(s[k]=='M')P*=1000000;
else if(s[k]=='m')P*=0.001;
k++;
}
//计算U
k=strstr(s,"U=")-s;
k+=2;
if(s[k]=='-')flag2=1;
double U=0,u=0;
while((s[k]>='0'&&s[k]<='9')||s[k]=='.') {
if(s[k]=='.')break;
U=U*10+(s[k]-'0');
k++;
}
if(s[k]=='.') {
k++;
int t=1;
while(s[k]>='0'&&s[k]<='9') {
u+=(s[k]-'0')*pow(0.1,t++);
k++;
}
}
U+=u;
while(s[k]!='V') {
if(s[k]=='k'||s[k]=='K')U*=1000;
else if(s[k]=='M')U*=1000000;
else if(s[k]=='m')U*=0.001;
k++;
}
if(flag1)P*=-1;
if(flag2)U*=-1;
printf("I=%.2lfA\n\n",P/U);
}
}
return 0;
}