Posted on 2009-11-12 22:38
Uriel 閱讀(558)
評論(0) 編輯 收藏 引用 所屬分類:
POJ
就是個簡單化學問題。。
方程是: nx^2+kx-mck=0 (k==ka,c==已知初始濃度) 解下就行
搞了好幾個小時。。WA無數次。。很無語。。以為是精度問題。。結果是輸入沒處理好。。不一定是sample那樣的。。
然后改啊改。。結果是90行搞輸入和第一步處理。。計算只要3行。。。猥瑣丑陋的代碼如下:

/**//*Problem: 2006 User: Uriel
Memory: 216K Time: 125MS
Language: C++ Result: Accepted*/

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char str1[10],str2[10];
double n,m,s;
double res,tmp,c,k,delta,x;
int flag;

int main()


{
int i,j;
while(1)

{
scanf("%s",str1);
scanf("%s",str2);
scanf("%lf %lf",&m,&n);
if(strcmp(str1,"0")==0 && strcmp(str2,"0")==0 && !n && !m)break;
k=0;
s=1;
flag=1;
for(i=0;i<strlen(str1);i++)

{
if(str1[i]=='e')break;
if(str1[i]=='.')

{
flag=2;
continue;
}
if(flag==1)

{
k=k*10+str1[i]-'0';
}
else if(flag==2)

{
s*=0.1;
k+=(str1[i]-'0')*s;
}
}
s=0;
flag=1;
for(j=i+1;j<strlen(str1);j++)

{
if(str1[j]=='-')

{
flag=2;
}
else

{
s=s*10+str1[j]-'0';
}
}
if(flag==2)s*=-1;
k*=pow(10.0,s);
c=0;
s=1;
flag=1;
for(i=0;i<strlen(str2);i++)

{
if(str2[i]=='e')break;
if(str2[i]=='.')

{
flag=2;
continue;
}
if(flag==1)

{
c=c*10+str2[i]-'0';
}
else if(flag==2)

{
s*=0.1;
c+=(str2[i]-'0')*s;
}
}
s=0;
flag=1;
for(j=i+1;j<strlen(str2);j++)

{
if(str2[j]=='-')

{
flag=2;
}
else

{
s=s*10+str2[j]-'0';
}
}
if(flag==2)s*=-1;
c*=pow(10.0,s);
getchar();
delta=sqrt(k*k+4*n*c*k*m);
tmp=(-k+delta)/(2*n);
res=-log10(tmp);
printf("%.3lf\n",res);
}
system("PAUSE");
return 0;
}
