<div class="lytitle" style="line-height: 35px; padding: 0px 5px; color: rgb(255, 255, 255); background-color: rgb(31, 103, 211); font-family: 'Lucida Grande', Lucida, 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, 'Segoe UI', Verdana, 微软雅黑, 'Microsoft YaHei', 宋体; font-size: 14px;"><span class="pid" style="font-weight: bold; padding-right: 10px;"></span></div>P1344计算器的改良Wrong Answer 标签:NOIP普及组2000[显示标签] 描述 问题描述: NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例: 4+3x=8 6a-5+1=2-2a -5+12y=0 ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。 问题求解: 编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。 你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。<div class="lycontent" style="padding: 10px; position: relative; color: rgb(51, 51, 51); font-family: 'Lucida Grande', Lucida, 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, 'Segoe UI', Verdana, 微软雅黑, 'Microsoft YaHei', 宋体; font-size: 14px; line-height: 21px;"><div class="pcontent" style="outline: 0px;"><div class="colorize" style="border-top-width: 5px; border-top-style: solid; border-top-color: rgb(86, 165, 235); padding: 10px;"><div class="colorize-content" style="border: 0px; padding: 10px; margin: 0px; word-wrap: break-word; word-break: break-all;"><pre style="margin-top: 0px; margin-bottom: 0px; word-wrap: break-word; word-break: break-all; font-family: 'YaHei Consolas Hybrid', Consolas, 'Lucida Console', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace, 宋体;"><code style="margin: 0px; word-wrap: break-word; word-break: break-all; font-family: 'YaHei Consolas Hybrid', Consolas, 'Lucida Console', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace, 宋体;"></code>
6a-5+1=2-2a
a=0.750
1 second
NOIP 2000年 第六届 普及组 第1题
//整体思路,把整个方程式化简成左边是未知数,而右边是常数的形式 import java.io.*; import java.util.*; import java.text.DecimalFormat; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); double count = 0, constant = 0; // constant记录未知数的个数,count记录总的数值 String equation, equation1; // 方程式的字符串 int Equivalent = 0; // 记录等号位置 int LastFlag = 0; // 记录最后一个未知数的个数 char UnknowNumber = 'a'; // 记录改未知数是那个未知数 equation1 = input.nextLine(); equation = '+' + equation1; equation = equation.replaceAll("=", "=+"); // System.out.println(equation); /* * System.out.println(equation.length()); */ char[] chars = equation.toCharArray(); Equivalent = equation.indexOf('='); /* * 记录等号左边的运算 (因为换边的话会改变符号) */ for (int i = 0; i < Equivalent; i++) { if ((chars[i] >= 'a' && chars[i] <= 'z') || (chars[i] >= 'A' && chars[i] <= 'Z')) { UnknowNumber = chars[i]; // 记住该未知数 int FlagForFirst = 0; // FlagForFirst记录当前未知数的位置 String x; // x记录当前未知数的个数 boolean XSign = true; // 新的未知数标志记录符号 for (int j = i; j > 0; j--) { if (chars[j] == '+') { FlagForFirst = j; XSign = true; break; } if (chars[j] == '-') { FlagForFirst = j; XSign = false; break; } } x = equation.substring(FlagForFirst + 1, i); int y = Integer.parseInt(x); // y记录当前未知数的个数 if (XSign) { constant += y; } else { constant -= y; } // System.out.println(constant); } } /* * 从这里开始计算剩余项 */ boolean Finish = true; // 设置一个标志为记录中间是否有未知数,false表示有字母,true表示没有字母 String CountForNumber; // 记录数字运算,count记录总的数值 boolean YSign = true; // 记录数字的符号 for (int i = 0; i < Equivalent; i++) { int j; if (chars[i] == '+' || chars[i] == '-') { if (chars[i] == '+') { YSign = true; } if (chars[i] == '-') { YSign = false; } j = i + 1; while (chars[j] != '+' && chars[j] != '-' && chars[j] != '=') { j++; } // System.out.println(i+" "+j); // 测试在两个运算符号之间 Finish = true; for (int k = j; k > i; k--) { if ((chars[k] >= 'a' && chars[k] <= 'z') || (chars[k] >= 'A' && chars[k] <= 'Z')) { Finish = false; break; } if (k == i + 1 && Finish) { CountForNumber = equation.substring(i + 1, j); // System.out.println(CountForNumber); int temp = Integer.parseInt(CountForNumber); if (YSign) { count -= temp; } else { count += temp; } // System.out.println(count); } } } } /* * * 开始计算右边的值 写到这里其实已经完成了70%了,因为算法是一样的,只不过左边和右边需要变号 * 修改一下原来的代码,左边的算式计算完毕,接下来就是计算右边的 算式了。 */ for (int i = Equivalent; i < equation.length(); i++) { if ((chars[i] >= 'a' && chars[i] <= 'z') || (chars[i] >= 'A' && chars[i] <= 'Z')) { int FlagForFirst = 0; // FlagForFirst记录当前未知数的位置 String x; // x记录当前未知数的个数 boolean XSign = true; // 新的未知数标志记录符号 for (int j = i; j > 0; j--) { if (chars[j] == '+') { FlagForFirst = j; XSign = true; break; } if (chars[j] == '-') { FlagForFirst = j; XSign = false; break; } } x = equation.substring(FlagForFirst + 1, i); int y = Integer.parseInt(x); // y记录当前未知数的个数 if (XSign) { constant -= y; } else { constant += y; } // System.out.println(constant); } } boolean Finish2 = true; // 设置一个标志为记录中间是否有未知数,false表示有字母,true表示没有字母 String CountForNumber2; // 记录数字运算,count记录总的数值 boolean YSign2 = true; // 记录数字的符号 for (int i = Equivalent; i < equation.length() - 2; i++) { int j; if (chars[i] == '+' || chars[i] == '-') { if (chars[i] == '+') { YSign2 = true; } if (chars[i] == '-') { YSign2 = false; } j = i + 1; while (chars[j] != '+' && chars[j] != '-' && j < equation.length() - 1) { j++; } // System.out.println(i+" "+j); // 测试在两个运算符号之间 Finish2 = true; for (int k = j; k > i; k--) { if ((chars[k] >= 'a' && chars[k] <= 'z') || (chars[k] >= 'A' && chars[k] <= 'Z')) { Finish2 = false; break; } if (k == i + 1 && Finish2) { CountForNumber2 = equation.substring(i + 1, j); // System.out.println(CountForNumber); int temp = Integer.parseInt(CountForNumber2); if (YSign2) { count += temp; } else { count -= temp; } } } } } /* * System.out.println(constant); System.out.println(count); */ DecimalFormat df = new DecimalFormat("0.000"); double answer = count / constant; System.out.print(UnknowNumber + "="); System.out.println(df.format(answer)); } }