两份AC代码,2021年代码更简洁,并且不失可读性
2020年12月代码
// 错误之处 忘记了 从字符串中读数字 abc11 只能一位一位的读,不能一下就读到11
//以下为AC代码
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
double n[4] = {12.01,1.008,16.00,14.01};
vector<int> v;
int main()
{
int T;
cin >> T;
while(T--){
double sum = 0;
string str;
cin >> str;
int len = str.length(), num = 0;
for(int i = len-1; i>=0; i--){
int lon = 0;
num = 0;
while(isdigit(str[i]) ) {
v.push_back(str[i]-48);
i--;
lon ++;
}
for(int j=0;j<lon;j++){
num += v.front()*pow(10,j);
v.erase(v.begin());
}
if(num == 0) num = 1;
switch(str[i]){
case 'C':
sum += num*n[0];
break;
case 'H':
sum += num*n[1];
break;
case 'O':
sum += num*n[2];
break;
case 'N':
sum += num*n[3];
break;
}
num = 1;
}
printf("%.3lf\n", sum);
}
return 0;
}
2021年4月4日代码
#include<stdio.h>
#include<map>
#include<iostream>
#include<math.h>
#include<string.h>
#include<ctype.h>
#define maxn 80 + 5
char s[maxn];
std::map<char, double> myMap;
double count(char *s)
{
int len = strlen(s);
double ans = 0;
for(int i = 0; i < len; i++)
{
int j, num = 0;
for( j = i; j < len && isdigit(s[j+1]); j++); //统计到从数字起始位到末位的标。&&短路符号 避免了非法内存访问。
// std::cout << "isdigit[j+1] == " <<isdigit(s[j+1]) << std::endl;
if(j > i)
{
for(int k = i + 1; k <= j; k++)
num += (s[k] - '0') * pow(10, j-k);
ans += myMap[s[i]] * num;
}
else ans += myMap[s[i]];
i = j;
}
return ans;
}
int main()
{
myMap['C'] = 12.01;
myMap['H'] = 1.008;
myMap['O'] = 16.00;
myMap['N'] = 14.01;
int T;
scanf("%d", &T);
while(T--) //这一行完成 T立马减一
{
scanf("%s", s);
double ans = count(s);
printf("%.3f\n", ans);
}
return 0;
}