import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MolecularMassCalculator {
private static final Pattern elementPattern = Pattern.compile("[A-Z][a-z]*");
private static final Map<String, Double> elementMap = new HashMap<>();
static {
elementMap.put("H", 1.008);
elementMap.put("He", 4.0026);
elementMap.put("Li", 6.941);
elementMap.put("Be", 9.0122);
elementMap.put("B", 10.811);
elementMap.put("C", 12.0101);
elementMap.put("N", 14.0067);
elementMap.put("O", 15.9994);
elementMap.put("F", 18.9984);
elementMap.put("Ne", 20.1797);
elementMap.put("Na", 22.9897);
elementMap.put("Mg", 24.305);
elementMap.put("Al", 26.9815);
elementMap.put("Si", 28.0855);
elementMap.put("P", 30.9738);
elementMap.put("S", 32.065);
elementMap.put("Cl", 35.453);
elementMap.put("K", 39.0983);
elementMap.put("Ar", 39.948);
elementMap.put("Ca", 40.078);
elementMap.put("Sc", 44.9559);
elementMap.put("Ti", 47.867);
elementMap.put("V", 50.9415);
elementMap.put("Cr", 51.9961);
elementMap.put("Mn", 54.938);
elementMap.put("Fe", 55.845);
elementMap.put("Ni", 58.6934);
elementMap.put("Co", 58.9332);
elementMap.put("Cu", 63.546);
elementMap.put("Zn", 65.39);
elementMap.put("Ga", 69.723);
elementMap.put("Ge", 72.64);
elementMap.put("As", 74.9216);
elementMap.put("Se", 78.96);
elementMap.put("Br", 79.904);
elementMap.put("Kr", 83.8);
elementMap.put("Rb", 85.4678);
elementMap.put("Sr", 87.62);
elementMap.put("Y", 88.9059);
elementMap.put("Zr", 91.224);
elementMap.put("Nb", 92.9064);
elementMap.put("Mo", 95.94);
elementMap.put("Tc", 98.00);
elementMap.put("Ru", 101.07);
elementMap.put("Rh", 102.9055);
elementMap.put("Pd", 106.4);
elementMap.put("Ag", 107.8682);
elementMap.put("Cd", 112.411);
elementMap.put("In", 114.818);
elementMap.put("Sn", 118.71);
elementMap.put("Sb", 121.76);
elementMap.put("I", 126.9045);
elementMap.put("Te", 127.6);
elementMap.put("Xe", 131.293);
elementMap.put("Cs", 132.9055);
elementMap.put("Ba", 137.327);
elementMap.put("La", 138.9055);
elementMap.put("Ce", 140.116);
elementMap.put("Pr", 140.9077);
elementMap.put("Nd", 144.24);
elementMap.put("Pm", 145.00);
elementMap.put("Sm", 150.36);
elementMap.put("Eu", 151.964);
elementMap.put("Gd", 157.25);
elementMap.put("Tb", 158.9253);
elementMap.put("Dy", 162.5);
elementMap.put("Ho", 164.9303);
elementMap.put("Er", 167.259);
elementMap.put("Tm", 168.9342);
elementMap.put("Yb", 173.04);
elementMap.put("Lu", 174.967);
elementMap.put("Hf", 178.49);
elementMap.put("Ta", 180.9479);
elementMap.put("W", 183.84);
elementMap.put("Re", 186.207);
elementMap.put("Os", 190.23);
elementMap.put("Ir", 192.217);
elementMap.put("Pt", 195.078);
elementMap.put("Au", 195.9665);
elementMap.put("Hg", 200.59);
elementMap.put("Ti", 204.3833);
elementMap.put("Pb", 207.2);
elementMap.put("Bi", 208.9804);
elementMap.put("Po", 209.00);
elementMap.put("At", 210.00);
elementMap.put("Rn", 222.00);
elementMap.put("Fr", 223.00);
elementMap.put("Ra", 226.00);
elementMap.put("Ac", 227.00);
elementMap.put("Pa", 231.0359);
elementMap.put("Th", 232.0381);
elementMap.put("Np", 237.00);
elementMap.put("U", 238.0289);
elementMap.put("Am", 243.00);
elementMap.put("Pu", 244.00);
elementMap.put("Cm", 247.00);
elementMap.put("Bk", 247.00);
elementMap.put("Cf", 251.00);
elementMap.put("Es", 252.00);
elementMap.put("Fm", 257.00);
elementMap.put("Md", 258.00);
elementMap.put("No", 259.00);
elementMap.put("Rf", 261.00);
elementMap.put("Lr", 262.00);
elementMap.put("Db", 262.00);
elementMap.put("Bh", 264.00);
elementMap.put("Sg", 266.00);
elementMap.put("Mt", 268.00);
elementMap.put("Rg", 272.00);
elementMap.put("Hs", 277.00);
elementMap.put("Ds", 281.00);
elementMap.put("Cn", 285.00);
elementMap.put("Nh", 286.00);
elementMap.put("Fl", 289.00);
elementMap.put("Mc", 289.00);
elementMap.put("Lv", 293.00);
elementMap.put("Ts", 294.00);
elementMap.put("Og", 294.00);
}
public static String balanceFormula(String formula, double molecularWeight) {
Map<String, Integer> elementCounts = countElements(formula);
double totalCalculatedWeight = calculateMolecularWeight(elementCounts);
double multiplier = molecularWeight / totalCalculatedWeight;
StringBuilder balancedFormula = new StringBuilder();
for (Map.Entry<String, Integer> entry : elementCounts.entrySet()) {
balancedFormula.append(entry.getKey());
if (entry.getValue() > 1) {
balancedFormula.append(String.format("%d", (int) Math.round(entry.getValue() * multiplier)));
}
}
return balancedFormula.toString();
}
private static Map<String, Integer> countElements(String formula) {
Map<String, Integer> elementCounts = new HashMap<>();
Matcher matcher = elementPattern.matcher(formula);
while (matcher.find()) {
String element = matcher.group();
elementCounts.put(element, elementCounts.getOrDefault(element, 0) + 1);
}
return elementCounts;
}
private static double calculateMolecularWeight(Map<String, Integer> elementCounts) {
double totalWeight = 0.0;
for (Map.Entry<String, Integer> entry : elementCounts.entrySet()) {
totalWeight += elementMap.get(entry.getKey()) * entry.getValue();
}
return totalWeight;
}
//public static void main(String[] args) {
//String formula = "C6H12O6";
//double molecularWeight = 180.156;
//String balancedFormula = balanceFormula(formula, molecularWeight);
//System.out.println("Balanced formula: " + balancedFormula);
//}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the chemical formula: ");
String formula = scanner.nextLine();
double molecularWeight = calculateMolecularWeight(countElements(formula));
String balancedFormula = balanceFormula(formula, molecularWeight);
System.out.println("Molecular weight: " + molecularWeight);
scanner.close();
}
}