Advertisement
Guest User

Untitled

a guest
May 21st, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.00 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5.  
  6. int main(int argc, char * argv[]){
  7.     setlocale(LC_ALL, "RUS");
  8.     char * str1 = argv[1];
  9.     char * str2 = argv[2];
  10.     int len1 = strlen(str1); // длина первого многочлена
  11.     int len2 = strlen(str2); // длина второго многочлена
  12.     if (len1 % 3 != 0){ // Если длина не кратна 3
  13.         printf("Первая строка не кратна 3\n");
  14.         return -1;
  15.     }
  16.     if (len2 % 3 != 0){ // Если длина не кратна 3
  17.         printf("Вторая строка не кратна 3\n");
  18.         return -1;
  19.     }
  20.  
  21.     for (int i = 0; i < len1; i = i+3){ // проверяем каждый третий символ в строке
  22.         if (str1[i] != '+' && str1[i] != '-'){ // если он не является знаком
  23.             printf("Первый символ в мономе первого многочлена не является знаком\n"); // выводим ошибку
  24.             return -1; // заканчиваем работу программы
  25.         }
  26.     }
  27.  
  28.     for (int i = 0; i < len2; i = i+3){ // то же самое но для второй строки
  29.         if (str2[i] != '+' && str2[i] != '-'){
  30.             printf("Первый символ в мономе второго многочлена не является знаком\n"); // выводим ошибку
  31.             return -1;
  32.         }
  33.     }
  34.  
  35.     int * mon1 = (int*)malloc(2*sizeof(int) * len1/3); // выделяем по два int'а на каждую тройку символов
  36.     int * mon2 = (int*)malloc(2*sizeof(int) * len2/3); // то же самое для второй строки
  37.  
  38.     for (int i = 0; i < len1; i = i+3){
  39.         mon1[i] = str1[i+1] - '0'; // переводим второй сивмол из тройки в число, вычитая из него номер символа 0
  40.         if (mon1[i] > 9){ // если символ окажется не цифрой
  41.             printf("Символ %c не является числом", mon1[i]); // выводим ошибку
  42.             return -1; // завершаем
  43.         }
  44.         if (str1[i] == '-'){ // если знак был минус
  45.             mon1[i] = -mon1[i]; // то умножаем коэффициент на -1
  46.         }
  47.         mon1[i+1] = str1[i+2] - '0'; // переводим третий символ в число
  48.         if (mon1[i+1] > 9){ // если символ окажется не цифрой
  49.             printf("Символ %c не является числом\n", mon1[i+1]); // выводим ошибку
  50.             return -1; // завершаем
  51.         }
  52.     }
  53.  
  54.     for (int i = 0; i < len2; i = i+3){
  55.         mon2[i] = str2[i+1] - '0'; // переводим второй сивмол из тройки в число, вычитая из него номер символа 0
  56.         if (mon2[i] > 9){ // если символ окажется не цифрой
  57.             printf("Символ %c не является числом\n", mon2[i]); // выводим ошибку
  58.             return -1; // завершаем
  59.         }
  60.         if (str2[i] == '-'){
  61.             mon2[i] = -mon2[i];
  62.         }
  63.         mon2[i+1] = str2[i+2] - '0';
  64.         if (mon2[i+1] > 9){ // если символ окажется не цифрой
  65.             printf("Символ %c не является числом\n", mon2[i+1]); // выводим ошибку
  66.             return -1; // завершаем
  67.         }
  68.     }
  69.  
  70.     int * mon3 = (int*)malloc(2*sizeof(int) * (len1+len2)/3); // для результата выделяем столько памяти, чтобы хватило, если все степени будут разные
  71.  
  72.     int flag = 0;
  73.     int last = 0;
  74.     for (int i = 0; i < len1/3; i=i+2){ // пробегаем по первому многочлену
  75.         flag = 0;
  76.         for (int j = 0; j < len2/3; j=j+2){ // пробегаем по второму многочлену
  77.             printf("%d %d and %d %d\n", mon1[i], mon1[i+1], mon2[i], mon2[i+1]);
  78.             if (mon1[i+1] == mon2[j+1] && flag == 0){ // если находим одинаковые степени, которые не встречались до этого
  79.                 mon3[i+1] = mon1[i+1]; // записываем в новый многочлен эту степень
  80.                 mon3[i] = mon1[i] + mon2[j]; // складываем коэффициенты
  81.                 flag = 1; // устанавливаем флаг в 1
  82.             }
  83.             else if (mon1[i+1] == mon2[i+j] && flag == 1){ // если степень встретилась еще раз, значит в многочлене она была несколько раз
  84.                 printf("Несколько раз встретилась одна и та же степень\n"); // выводим ошибку
  85.                 return -1; // завершаем
  86.             }
  87.         }
  88.         if (flag == 0){ // если не нашли такую же степень во втором многочлене
  89.             mon3[i] = mon1[i]; // просто добавляем коэффициент из первого многочлена
  90.             mon3[i+1] = mon1[i+1]; // добавляем степень из первого многочлена
  91.             last = i+2; // сохраняем позицию в новом многочлене
  92.         }
  93.     }
  94.  
  95.     for (int i = 0; i < len2/3; i=i+2){ // осталось добавить те мономы, которые встречаются только во втором многочлене
  96.         flag = 0; // флаг будет означать, нашли мы такую степень в первом или нет
  97.         for (int j = 0; j < len1/3; j=j+2){
  98.             if (mon2[i+1] == mon1[i+1]){ // нашли ту же степень
  99.                 flag = 1; // устанавливаем флаг
  100.             }
  101.         }
  102.         if (flag == 0){ // если так и не нашли
  103.             mon3[last] = mon2[i]; // записываем коэф
  104.             mon3[last+1] = mon2[i+1]; // записываем степень
  105.             last = last + 2; // запоминаем позицию
  106.         }
  107.     }
  108.  
  109.     printf("%d\n", last);
  110.  
  111.     for (int i = 0; i < last; i=i+2){
  112.         if (mon3[i] > 0){
  113.             printf("+%dx^%d", mon3[i], mon3[i+1]);
  114.         }
  115.         else {
  116.             printf("%dx^%d", mon3[i], mon3[i+1]);
  117.         }
  118.     }
  119.  
  120.     free(mon1);
  121.     free(mon2);
  122.     free(mon3);
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement