fork download
  1. import java.util.*;
  2.  
  3. class Main
  4. {
  5. static int strToInt(String s, int begin, int end){ //Принимает строку и индексы первого и последнего символов, между которыми в ней (предположительно) записано число (последний не включительно).
  6. int val = 0; //Возвращает объект типа int, значение которого равно этому числу.
  7. boolean negative = false; //Является ли число отрицательным?
  8. if(s.charAt(begin) == '+') begin++;//Плюс игнорируется.
  9. else{
  10. if(s.charAt(begin) == '-'){ //Проверка на отрицательность.
  11. negative = true;
  12. begin++;
  13. }
  14. }
  15. for(int i = begin; i < end; ++i){ //Обработка самих цифр числа.
  16. val *= 10;
  17. val += s.charAt(i) - 48;
  18. }
  19. if(val == 0 && s.charAt(begin) != '0') val++; //Если значение получилось равным нулю, но в исходной строке не только ноль, значит, обрабатывается строка вида "+x", в которой при записи опускается единица
  20. if(negative == true) val *= -1;
  21. return val;
  22. }
  23.  
  24. static String intToStr(int val){ //Возвращает строку с записанным в ней числом val.
  25. String s = "", tmp = "";
  26. if(val > 0) s = s + "+"; //Проверка на отрицательность.
  27. else{
  28. val *= -1;
  29. s = s + "-";
  30. }
  31. while(val > 0){
  32. tmp = tmp + Integer.toString(val%10); //В tmp хранится запись числа в обратном порядке.
  33. val /= 10;
  34. }
  35. for(int i = tmp.length()-1; i >= 0; --i){ //Переписывание элементво из tmp в s в верном порядке.
  36. s = s + tmp.charAt(i);
  37. }
  38. return s;
  39. }
  40.  
  41. static String eraseThePlus(String s){ //Удаляет плюс, стоящий в начале строки.
  42. if(s.charAt(0) == '+') s = s.substring(1, s.length());
  43. return s;
  44.  
  45. }
  46.  
  47. static String eraseTheOne(String s){ //Удаляет единицу из строк вида "+1x", "-1x^y".
  48. if((s.charAt(1) == '1') && (s.length() == 2)) s = s.charAt(0) + s.substring(2, s.length());
  49. return s;
  50. }
  51.  
  52. static void analyze(String s, Vector v){ //Анализирует строку и увеличивает соответствующие элементы вектора на коэфициенты при степенях х.
  53. for(int i = 0; i < 11; ++i) v.addElement(0);
  54. if(s.indexOf('x') == -1) v.set(0, (int)(v.elementAt(0)) + strToInt(s, 0, s.length()));
  55. else{
  56. if(s.indexOf('^') == -1) v.set(1, (int)(v.elementAt(1)) + strToInt(s, 0, s.indexOf("x"))); //Строка вида "ax".
  57. else{
  58. int power = strToInt(s, s.indexOf("^") + 1, s.length()); //Строка вида "ax^y".
  59. v.set(power, (int)(v.elementAt(power)) + strToInt(s, 0, s.indexOf("x")));
  60. }
  61. }
  62. }
  63.  
  64. static Vector decompose(String s){ //Разбивает многочлен на слогаемые и возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
  65. Vector v = new Vector();
  66. String cur_s = "";
  67. int i = 0;
  68. while(i < s.length()){
  69. cur_s = "";
  70. cur_s = cur_s + s.charAt(i);
  71. i++;
  72. while((i < s.length()) && (s.charAt(i) != '+') && (s.charAt(i) != '-')){ //cur_s - анализируемое в данный момент слогаемое.
  73. cur_s = cur_s + s.charAt(i);
  74. i++;
  75. }
  76. analyze(cur_s, v);
  77. }
  78. return v;
  79. }
  80.  
  81. static Vector multiplicate (Vector a, Vector b){ //Умножение многочленов.
  82. Vector c = new Vector(); //Возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
  83. for(int i = 0; i < 21; ++i) c.addElement(0);
  84. for(int i = 0; i < 11; ++i){
  85. for(int j = 0; j < 11; ++j){
  86. c.set(i+j, ((int)(c.elementAt(i+j)))+((int)(a.elementAt(i)))*((int)(b.elementAt(j))));
  87. }
  88. }
  89. return c;
  90. }
  91.  
  92. static String compose(Vector v){ //Из элементов вектора составляет строку, в которой записан многочлен.
  93. String s = "";
  94. for(int i = v.size() - 1; i >= 2; --i){
  95. if((int)v.elementAt(i) != 0){
  96. String coef = intToStr((int)v.elementAt(i)); //Коэффициент.
  97. coef = eraseTheOne(coef);
  98. s = s + coef;
  99. s = s + "x";
  100. s = s + "^";
  101. String power = intToStr(i); //Степень х.
  102. power = eraseThePlus(power);
  103. s = s + power;
  104. }
  105. }
  106. if((int)v.elementAt(1) != 0){ //Записи слогаемых с первой и нулевой степенями х отличаются.
  107. String coef = intToStr((int)v.elementAt(1));
  108. coef = eraseTheOne(coef);
  109. s = s + coef;
  110. s = s + "x";
  111. }
  112. if((int)v.elementAt(0) != 0){
  113. s = s + intToStr((int)v.elementAt(0));
  114. }
  115. return s;
  116. }
  117.  
  118. public static void main (String[] args) throws java.lang.Exception
  119. {
  120. Scanner in = new Scanner(System.in);
  121. String a = in.nextLine();
  122. String b = in.nextLine();
  123. String c = new String();
  124. Vector a_decomposed = new Vector(11);
  125. Vector b_decomposed = new Vector(11);
  126. a_decomposed = decompose(a);
  127. b_decomposed = decompose(b);
  128. Vector c_decomposed = multiplicate(a_decomposed, b_decomposed);
  129. c = compose(c_decomposed);
  130. if(c.length() > 0){
  131. c = eraseThePlus(c); //Удаляется первый плюс, если он есть.
  132. System.out.print(c);
  133. }
  134. else System.out.print(0); //Если в ответе получаем константу 0.
  135. }
  136. }
Success #stdin #stdout 0.07s 4386816KB
stdin
x^10
0
stdout
Standard output is empty