一道有关字符串处理i的题目,很普通,只要注意下一个元素后面的数字的统计就行了,因为题目数 2<N<99 所以只要判断出来他是一位数还是两位数就行了,
切记flag标记,一开始掉了flag==1的判断,调了10分钟,QAQ
这个是我一开始的错误代码,,还没出来~
# include<cstdio> # include<iostream> # include<cstring> using namespace std; # define MAX 100 char s[MAX]; int main(void) { int t; cin>>t; while ( t-- ) { int k1 = 0; int k2 = 0; int k3 = 0; int k4 = 0; scanf("%s",s); int n = strlen(s); double sum = 0; for ( int i = 0;i < n;i++ ) { if ( s[i] == 'C' ) { if ( (s[i+1]<='9'&&s[i+1]>='1') ) { if (s[i+2]<='9'&&s[i+2]>='1') { k1 = s[i+1]*10+s[i+2]; } else k1 = s[i+1]; } else k1 = 1; } if ( s[i] == 'H' ) { if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]<='9'&&s[i+2]>='1') ) { k2 = s[i+1]*10+s[i+2]; } else if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]=='C'||s[i+2]=='O' ||s[i+2]=='N') ) { k2 = s[i+1]; } else k2 = 1; } if ( s[i] == 'O' ) { if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]<='9'&&s[i+2]>='2') ) { k3 = s[i+1]*10+s[i+2]; } else if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]=='H'||s[i+2]=='C' ||s[i+2]=='N') ) { k3 = s[i+1]; } else k3 = 1; } if ( s[i] == 'N' ) { if ( s[i+1]<='9'&&s[i+1]>='1'&&s[i+2]<='9'&&s[i+2]>='1' ) { k4 = s[i+1]*10+s[i+2]; } else if ( s[i+1]<='9'&&s[i+1]>='1'&&(s[i+2]=='H'||s[i+2]=='O' ||s[i+2]=='C') ) { k4 = s[i+1]; } else k4 = 1; } } cout<<k1<<endl; cout<<k2<<endl; cout<<k3<<endl; cout<<k4<<endl; sum = k1*12.01+k2*1.008+k3*16.00+k4*14.01; printf("%.3lfg/mol\n",sum); } return 0; }
重新打的:
# include<cstdio> # include<iostream> # include<cstring> using namespace std; # define MAX 100 char s[MAX+10]; double a[MAX+10]; int g ( int x,int y ) { int t; for ( int i = x;i < y;i++ ) { if ( s[i] <= '9'&&s[i] >= '0' ) t = i; else break; } int sum = 0; for ( int i = x;i <= t;i++ ) { sum = sum*10+( s[i] - '0' ); } return sum-1; } int main(void) { int t;cin>>t; while ( t-- ) { scanf("%s",s); int len = strlen(s); int flag = 0; for ( int i = 0;i < len;i++ ) { if ( s[i] == 'C' )a[i] = 12.01; if ( s[i] == 'H' )a[i] = 1.008; if ( s[i] == 'O' )a[i] = 16.00; if ( s[i] == 'N' )a[i] = 14.01; if ( s[i] >= '1' && s[i] <= '9'&&flag == 0 ) {//flag = 0一定要切记!,调了10分钟 QAQ flag = 1; a[i] = a[i-1]*g(i,len); } if ( !( s[i] >= '0'&&s[i] <= '9') )flag = 0; } double sum1 = 0; for ( int i = 0;i < len;i++ ) { //cout<<a[i]<<endl; sum1+=a[i]; } printf("%.3lf\n",sum1); } return 0; }