Member 14507684 Ответов: 4

Я работаю над разделением больших чисел, которые представлены в виде строк. Но когда цифры большие, я получаю такое сообщение: kill signal (SIGKILL). Кто-нибудь может мне помочь?


bool compare(string m, string n)
 { if(m.length()>n.length()) return true;
   else if(m.length()<n.length()) return false;
   for(int i=0;i<m.length();i++)  
    {  if((m[i]-'0')>(n[i]-'0')) return true;
       if((m[i]-'0')<(n[i]-'0')) return false;   
    } 
  }     

    string substract(string str1, string str2)
     { string str = "";
      int n1 = str1.length(), n2 = str2.length();
      int m=n1-n2;
      for(int i=0;i<m;i++)
      str2="0"+str2;
      reverse(str1.begin(), str1.end());
      reverse(str2.begin(), str2.end());
      n2 = str2.length(); 
      int carry = 0;
      for (int i=0; i<n2; i++)
       { int sub = ((str1[i]-'0')-(str2[i]-'0')-carry);
          if (sub < 0)
           { sub = sub + 10;
             carry = 1;
           }
          else  carry = 0;
        str.push_back(sub + '0');
       }
      for (int i=n2; i<n1; i++)
       { int sub = ((str1[i]-'0') - carry);
         carry = 0;
        str.push_back(sub + '0');
       }
      reverse(str.begin(), str.end());
      if(str.length()>1) 
       { int i = 0; 
      while (str[i] == '0') 
       i++; 
      str.erase(0, i); } 
      return str;
    }

     string sum(string a, string b)
      { if(a.size() < b.size())
       swap(a, b);
       int j = a.size()-1;
       for(int i=b.size()-1; i>=0; i--, j--)
       a[j]+=(b[i]-'0');
       for(int i=a.size()-1; i>0; i--)
        {  if(a[i] > '9')
            {  int d = a[i]-'0';
               a[i-1] = ((a[i-1]-'0') + d/10) + '0';
               a[i] = (d%10)+'0';
            }
         }
        if(a[0] > '9')
           { string k;
             k+=a[0];
             a[0] = ((a[0]-'0')%10)+'0';
             k[0] = ((k[0]-'0')/10)+'0';
             a = k+a;
           }
        return a;
     }

    string division(string a, string b)
     { bool p;
       bool t=compare(a,b); 
       string ans;
      if(t==true)  p=true;
       while(p==true)
       { a=substract(a,b); 
         ans=sum(ans,"1"); 
         t=compare(a,b); 
        if(t==false) p=false; 
       } 
     return ans;    
      }


Что я уже пробовал:

Я написал код,который использует функции сравнения, вычитания и суммы для деления.

Patrice T

Дайте рабочий код и данные, которые показывают ошибку.

4 Ответов

Рейтинг:
4

Member 14507684

bool compare(string m, string n)
{if(m.length()>n.length()) return true;
else if(m.length()<n.length()) return false;
bool k=true;
for(int i=0;i<m.length();i++)
  { 
   if((m[i])!=(n[i])) k=false; 
  }
  if(k==true) return true; 
   else 
    {
     for(int i=0;i<m.length();i++)  
      {  
        if((m[i])>(n[i])) return true;
        if((m[i])<(n[i]))  return false;
      } 
    }
}


Member 14507684

Я изменил функцию сравнения вот так. Он все еще показывает мне эту ошибку: сигнал убийства(SIGKILL). Я не знаю, что делать. Возможно ли, что что-то еще вызывает эту проблему?

Рейтинг:
32

Patrice T

Этот код не должен компилироваться:

bool compare(string m, string n)
 { if(m.length()>n.length()) return true;
   else if(m.length()<n.length()) return false;
   for(int i=0;i<m.length();i++)  
    {  if((m[i]-'0')>(n[i]-'0')) return true;
       if((m[i]-'0')<(n[i]-'0')) return false;   
    } 
   // because there is no return value when both string are equal
  }

Оптимизация: обе линии делают одно и то же:
if((m[i]-'0')>(n[i]-'0')) return true;
if( m[i]     > n[i]     ) return true;

Единственное отличие заключается в том, что второй вариант проще и может быть быстрее в зависимости от оптимизации компилятора.


Stefan_Lang

Я думаю, что функция compare() предназначена для реализации "больше, чем"

Patrice T

Возможно, но когда оба значения одинаковы, функция все равно должна что-то возвращать.

Member 14507684

О, благодарю вас. Теперь я понял. Да, я использую функцию compare (), чтобы найти большее число. Можете ли вы сказать мне, что я могу сделать, чтобы избежать этой проблемы?

Patrice T

вам нужно заменить мой комментарий ответом, когда обе строки идентичны.

Member 14507684

"3948298909", "143" эти цифры вызывают ошибку.В некоторых случаях эта программа работает, если я меняю цифры. Это работает лучше, если числа малы

Рейтинг:
26

Stefan_Lang

Я уже добавил Это в свое решение 2, но, возможно, вы пропустили мою правку: вы должны изменить строку

bool p;
в вашей функции division() to bool
p=false;
Это дает правильный результат.

Я должен добавить, что результат неверен, когда деление не имеет остатка: для 150/15 я получаю 9, а для 1500/15 я получаю 99. Но это должно быть легко исправить.

P. S.: Я сделал нет измените функцию compare() !

P. P. S.: При использовании онлайн-компилятора на https://www.onlinegdb.com/online_c++_компилятор[^] ваша оригинальная программа работает даже без модификации, которую я предложил! Но это займет всего пару минут! Может быть, ваша система настроена на завершение процессов, которые работают дольше определенного срока?


Member 14507684

Большое вам спасибо за ваш комментарий. Я уже изменил значение на p = false, но оно все еще показывает мне ту же ошибку. Я использую rextester для компиляции своего кода, и я пробовал другие компиляторы. Программа работает очень долго. Может быть, это вызывает проблему? Потому что код хорошо работает для небольших чисел

Stefan_Lang

Ну, он работает с онлайн-компилятором, который я связал выше. Поэтому я могу только представить, что это какое-то ограничение, наложенное на вашу ОС, компилятор или систему.

SigKill звучит очень похоже на то, что ваш procss убит снаружи! Если это ваш персональный компьютер, то я понятия не имею, чем это вызвано. Если вы работаете в сети университета или компании, возможно, существует ограничение, применяемое сетевыми инструментами. В этом случае вам следует обратиться к администратору.

Рейтинг:
14

Stefan_Lang

1. ваша функция compare должна быть переименована в greater_than, потому что именно это она и делает.
2. Функция division() имеет ошибку: p не инициализируется, поэтому она может войти в цикл while, даже если a < b. попробуйте заменить

bool p;
с
bool p=false;