Biorąc pod uwagę wielomian z pojedynczą zmienną x, a wartość x jako dane wejściowe, oblicz jej wartość. Przykłady:Oceń ciąg wielomianowy bez użycia wyrażenia regularnego i interfejsu API
eval("-2x^3+10x-4x^2","3")=-60
eval("x^3+x^2+x","6")=258
Opis problemu: W ten kod przerwać łańcuch w fragmentu ilekroć +/- napotyka i przechodzi podciąg do funkcji, którą ocenia pojedynczego określenia jak „-2x^3”. Tak więc mój kod dla input = "-2x^3 + 10x-4x^2" oblicza tylko do "-2x^3 + 10x" i pomija część "-4x^2".
Czy ktoś może mi powiedzieć, co jest nie tak?
public class EvalPolyX2 {
static String testcase1 = "-2x^3+10x-4x^2";
static String testcase2 = "3";
public static void main(String args[]){
EvalPolyX2 testInstance = new EvalPolyX2();
int result = testInstance.eval(testcase1,testcase2);
System.out.println("Result : "+result);
}
public int eval(String str,String valx){
int sum = 0;
String subStr = "";
if(str.charAt(0) == '-')
{
int len = str.length();
for (int i = 0; i < len; i++)
{
if(str.charAt(i) == '-' || str.charAt(i) == '+')
{
subStr = str.substring(0, i);
System.out.println("subStr="+subStr);
sum += evalSubPoly(subStr, valx);
str = str.substring(i);
len = str.length();
i = 0;
}
}
}
else if(str.charAt(0) != '-')
{
str = '+' + str;
int len = str.length();
for (int i = 0; i < len; i++)
{
if(str.charAt(i) == '-' || str.charAt(i) == '+')
{
subStr = str.substring(0, i);
System.out.println("subStr="+subStr);
sum += evalSubPoly(subStr, valx);
str = str.substring(i);
len = str.length();
i=0;
}
}
}
return sum;
}
public int evalSubPoly(String poly,String valx){
int len = poly.length();
String num = "";
String power = "";
int exp = 0, coeff = 0;
for(int i = 0; i < len; i++)
{
if(poly.charAt(i) == 'x')
{
num = poly.substring(0, i);
coeff = Integer.parseInt(num);
}
if(poly.charAt(i) == '^')
{
power = poly.substring(i+1, len);
exp = Integer.parseInt(power);
}
}
if(power.equals(""))
exp = 1;
System.out.println("coeff="+coeff);
int sum = 1;
int x = Integer.parseInt(valx);
for (int i = 0; i < exp; i++)
{
sum = sum*x;
}
System.out.println("sum="+sum);
sum = sum*coeff;
return sum;
}
}
Pozwól mi przeformułować - Gdy próbuje uruchomić przykładowy kod jak jest, mam 'Wyjątek w wątku„głównym”java.lang.NumberFormatException: Dla ciągu wejściowego:„+10”'. Oznacza to, że próbka kodu nie powiela problemu, co utrudnia nam życie. – Dukeling
Dukeling ma rację, ponieważ wpisujesz znak +/- w ciąg po znalezieniu go. Aby tego uniknąć, musisz zmienić 'str = str.substring (i);' na 'str = str.substring (i + 1);' w ten sposób reszta łańcucha zaczyna się po +/- zamiast włączania to. –
Ale czy nie musi go dołączyć, jeśli to "-"? W przeciwnym razie fakt, że "-" zamiast "+" zostaje całkowicie utracony. – ajb