Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- int main(int argc, char * argv[]){
- setlocale(LC_ALL, "RUS");
- char * str1 = argv[1];
- char * str2 = argv[2];
- int len1 = strlen(str1); // длина первого многочлена
- int len2 = strlen(str2); // длина второго многочлена
- if (len1 % 3 != 0){ // Если длина не кратна 3
- printf("Первая строка не кратна 3\n");
- return -1;
- }
- if (len2 % 3 != 0){ // Если длина не кратна 3
- printf("Вторая строка не кратна 3\n");
- return -1;
- }
- for (int i = 0; i < len1; i = i+3){ // проверяем каждый третий символ в строке
- if (str1[i] != '+' && str1[i] != '-'){ // если он не является знаком
- printf("Первый символ в мономе первого многочлена не является знаком\n"); // выводим ошибку
- return -1; // заканчиваем работу программы
- }
- }
- for (int i = 0; i < len2; i = i+3){ // то же самое но для второй строки
- if (str2[i] != '+' && str2[i] != '-'){
- printf("Первый символ в мономе второго многочлена не является знаком\n"); // выводим ошибку
- return -1;
- }
- }
- int * mon1 = (int*)malloc(2*sizeof(int) * len1/3); // выделяем по два int'а на каждую тройку символов
- int * mon2 = (int*)malloc(2*sizeof(int) * len2/3); // то же самое для второй строки
- for (int i = 0; i < len1; i = i+3){
- mon1[i] = str1[i+1] - '0'; // переводим второй сивмол из тройки в число, вычитая из него номер символа 0
- if (mon1[i] > 9){ // если символ окажется не цифрой
- printf("Символ %c не является числом", mon1[i]); // выводим ошибку
- return -1; // завершаем
- }
- if (str1[i] == '-'){ // если знак был минус
- mon1[i] = -mon1[i]; // то умножаем коэффициент на -1
- }
- mon1[i+1] = str1[i+2] - '0'; // переводим третий символ в число
- if (mon1[i+1] > 9){ // если символ окажется не цифрой
- printf("Символ %c не является числом\n", mon1[i+1]); // выводим ошибку
- return -1; // завершаем
- }
- }
- for (int i = 0; i < len2; i = i+3){
- mon2[i] = str2[i+1] - '0'; // переводим второй сивмол из тройки в число, вычитая из него номер символа 0
- if (mon2[i] > 9){ // если символ окажется не цифрой
- printf("Символ %c не является числом\n", mon2[i]); // выводим ошибку
- return -1; // завершаем
- }
- if (str2[i] == '-'){
- mon2[i] = -mon2[i];
- }
- mon2[i+1] = str2[i+2] - '0';
- if (mon2[i+1] > 9){ // если символ окажется не цифрой
- printf("Символ %c не является числом\n", mon2[i+1]); // выводим ошибку
- return -1; // завершаем
- }
- }
- int * mon3 = (int*)malloc(2*sizeof(int) * (len1+len2)/3); // для результата выделяем столько памяти, чтобы хватило, если все степени будут разные
- int flag = 0;
- int last = 0;
- for (int i = 0; i < len1/3; i=i+2){ // пробегаем по первому многочлену
- flag = 0;
- for (int j = 0; j < len2/3; j=j+2){ // пробегаем по второму многочлену
- printf("%d %d and %d %d\n", mon1[i], mon1[i+1], mon2[i], mon2[i+1]);
- if (mon1[i+1] == mon2[j+1] && flag == 0){ // если находим одинаковые степени, которые не встречались до этого
- mon3[i+1] = mon1[i+1]; // записываем в новый многочлен эту степень
- mon3[i] = mon1[i] + mon2[j]; // складываем коэффициенты
- flag = 1; // устанавливаем флаг в 1
- }
- else if (mon1[i+1] == mon2[i+j] && flag == 1){ // если степень встретилась еще раз, значит в многочлене она была несколько раз
- printf("Несколько раз встретилась одна и та же степень\n"); // выводим ошибку
- return -1; // завершаем
- }
- }
- if (flag == 0){ // если не нашли такую же степень во втором многочлене
- mon3[i] = mon1[i]; // просто добавляем коэффициент из первого многочлена
- mon3[i+1] = mon1[i+1]; // добавляем степень из первого многочлена
- last = i+2; // сохраняем позицию в новом многочлене
- }
- }
- for (int i = 0; i < len2/3; i=i+2){ // осталось добавить те мономы, которые встречаются только во втором многочлене
- flag = 0; // флаг будет означать, нашли мы такую степень в первом или нет
- for (int j = 0; j < len1/3; j=j+2){
- if (mon2[i+1] == mon1[i+1]){ // нашли ту же степень
- flag = 1; // устанавливаем флаг
- }
- }
- if (flag == 0){ // если так и не нашли
- mon3[last] = mon2[i]; // записываем коэф
- mon3[last+1] = mon2[i+1]; // записываем степень
- last = last + 2; // запоминаем позицию
- }
- }
- printf("%d\n", last);
- for (int i = 0; i < last; i=i+2){
- if (mon3[i] > 0){
- printf("+%dx^%d", mon3[i], mon3[i+1]);
- }
- else {
- printf("%dx^%d", mon3[i], mon3[i+1]);
- }
- }
- free(mon1);
- free(mon2);
- free(mon3);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement