poj 2256 P U I 字符串

本文通过解析电功率公式P=UI的应用,详细介绍了如何从文本信息中提取电压(U)、电流(I)和功率(P)的数值,并根据已知两项求解第三项。涉及字符串处理、单位转换等编程技巧。

题意:看输入输出应该很明了,开始理解错了,以为输入的三句话是固定的呢,原来是任意的文本信息,然后没个字符串中,会出现P,U,I数值中的其中两个,然后根据P=UI,输出另外一个变量的数值。

这道题是在heu的练习上做的,没A,后来发现是北大的原题,弄了半天终于A了,真是考验耐心的好题啊!!懒得简化代码了~ 

#include<iostream>
#include<ctype.h>
using namespace std;
int main()
{
  char S[30000];
  char S1[10000],S2[10000];
  int N,t,len,s1,e1,s2,e2,s3,e3,i,g,h;
  int flag1,flag2,flag3;
  float a,b;
  scanf("%d",&N);
  getchar();
  for(t=1;t<=N;t++)
  {
    flag1=flag2=flag3=0;
    a=b=0;
    gets(S);
    len=strlen(S);
       for(i=0;i<len;i++)
       {
         if(S[i]=='U'&&S[i+1]=='=')
         {s1=i;flag1=1;}
         else if(S[i]=='V'&&((S[i-1]>='0'&&S[i-1]<='9')||(S[i-1]=='m'||S[i-1]=='k'||S[i-1]=='M')))//这里优先级总弄不好,还出错,多加几个括号吧
         {e1=i;}
         else if(S[i]=='I'&&S[i+1]=='=')
         {s2=i;flag2=1;}
         else if(S[i]=='A'&&((S[i-1]>='0'&&S[i-1]<='9')||(S[i-1]=='m'||S[i-1]=='k'||S[i-1]=='M')))
         e2=i;
         else if(S[i]=='P'&&S[i+1]=='=')
         {s3=i;flag3=1;}
         else if(S[i]=='W'&&((S[i-1]>='0'&&S[i-1]<='9')||(S[i-1]=='m'||S[i-1]=='k'||S[i-1]=='M')))
         e3=i;
       }
       if(flag1&&flag2)
       {
       for(g=0,h=s1+2;h<=e1;h++)
       S1[g++]=S[h];      
       S1[g]='\0';    
       a=atof(S1);
       //cout<<a<<endl;
       if(S[e1-1]=='m')
       a=a*0.001;
       else if(S[e1-1]=='k')
       a=a*1000.0;
       else if(S[e1-1]=='M')
       a=a*1000000.0;
       for(g=0,h=s2+2;h<=e2;h++)
       S2[g++]=S[h];
       S2[g]='\0';
       //cout<<S[e1];
       //cout<<S2<<endl;
       b=atof(S2);
       if(S[e2-1]=='m')
       b=b*0.001;
       else if(S[e2-1]=='k')
       b=b*1000.0;
       else if(S[e2-1]=='M')
       b=b*1000000.0;
       printf("Problem #%d\n",t);
       printf("P=%.2fW\n\n",a*b);
       }
       if(flag1&&flag3)
       {
       for(g=0,h=s3+2;h<=e3;h++)
       S1[g++]=S[h];  
       S1[g]='\0';
       //cout<<S1;          
       a=atof(S1);
       if(S[e3-1]=='m')
       a=a*0.001;
       else if(S[e3-1]=='k')
       a=a*1000.0;
       else if(S[e3-1]=='M')
       a=a*1000000.0;
       //cout<<a<<endl;
       for(g=0,h=s1+2;h<e1;h++)
       S2[g++]=S[h];
       S2[g]='\0';
       //cout<<S[e1]<<"啊";
       //cout<<S2;
       b=atof(S2);
       if(S[e1-1]=='m')
       b=b*0.001;
       else if(S[e1-1]=='k')
       b=b*1000.0;
       else if(S[e1-1]=='M')
       b=b*1000000.0;
       printf("Problem #%d\n",t);
       printf("I=%.2fA\n\n",a/b);
       }
       if(flag2&&flag3)
       {
       for(g=0,h=s3+2;h<=e3;h++)
       S1[g++]=S[h];  
       S1[g]='\0';
       //printf("e3=%d\n",e3);
       //cout<<S1;          
       a=atof(S1);
       if(S[e3-1]=='m')
       {a=a*0.001;} 
       else if(S[e3-1]=='k')
       {a=a*1000.0;}
       else if(S[e3-1]=='M')
       {a=a*1000000.0;}
       for(g=0,h=s2+2;h<=e2;h++)
       S2[g++]=S[h];
       S2[g]='\0';
       //cout<<S2;
       b=atof(S2);
       //cout<<b<<endl;
       if(S[e2-1]=='m')
       {b=b*0.001;}
       else if(S[e2-1]=='k')
       {b=b*1000.0;}
       else if(S[e2-1]=='M')
       {b=b*1000000.0;}
       //cout<<b;
       printf("Problem #%d\n",t);
       printf("U=%.2fV\n\n",a/b);
       }
  }
  //system("pause");
}
//2256


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值