Проблема с вводом/проверкой данных

Есть задача, которая сводится к тому, что нужно одно из двух введенных чисел преобразовать в максимально большое, а другое — в максимально малое, путем изменения порядка цифр в этих самых числах. Затем нужно найти разность этих чисел. Когда я запускаю свой код на repl.it или любом другом интерпретаторе с интерактивным вводом (т.е. я по очереди ввожу два числа), программа работает безотказно, но когда приходит время отправки ее на тест (через stdin), то она выдает какие-то абсолютно рандомные ответы и валится на 1м тесте. Кто поможет понять что не так?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool big(long long l, long long r){
  return l>r;
}
bool smol(long long l, long long r){
  return l<r;
}

int main() {
  long long a,b;
  bool ap, bp, zeroa, zerob;
  zeroa = 0;
  zerob = 0;

  cin >> a >> b;

  vector<long long> x;
  vector<long long> y;

  if(a == 0){
    x.push_back(0);
    zeroa = 1;
  }
  if(b == 0){
    y.push_back(0);
    zerob = 1;
  }
  if(a > 0){
    ap = 1;
    while(a!=0){
      x.push_back(a % 10);
      a = a / 10;
    }
    sort(x.begin(), x.end(), big);
  }
  if(a < 0){
    ap = 0;
    a = -a;
    while(a!=0){
      x.push_back(a % 10);
      a = a / 10;
    }
    sort(x.begin(), x.end(), smol);
  }
  if(b > 0){
    bp = 1;
    while(b!=0){
      y.push_back(b % 10);
      b = b / 10;
    }
    sort(y.begin(), y.end(), smol);
  }
  if(b < 0){
    bp = 0;
    b = -b;
    while(b!=0){
      y.push_back(b % 10);
      b = b / 10;
    }
    sort(y.begin(), y.end(), big);
  }
  if((y[0] == 0)  and (zerob == 0)){
    //while(y[0] == 0){
    for(long long r = 0; r<=y.size()-1;r++){
      if(y[r] != 0){
        long long cusy = y[r];
        y.insert(y.begin(), cusy);
        y.erase(y.begin() + r + 1);
        break;

      }
    }
  }

  if((x[0] == 0)  and (zeroa == 0)){
    //while(y[0] == 0){
    for(long long r = 0; r<=x.size()-1;r++){
      if(x[r] != 0){
        long long cusx = x[r];
         x.insert(x.begin(), cusx);
         x.erase(x.begin() + r + 1);
         break;

      }
    }
  }
  long long cntx = 1;
  long long resx;
  long long resy;
  for(long long i = x.size()-1; i>=0; i--){
    resx = resx + x[i] * cntx;
    cntx = cntx * 10;
  }
  long long cnty = 1;
  for(long long j = y.size()-1; j>=0; j--){
    resy = resy + y[j] * cnty;
    cnty = cnty * 10;
  }
  cout << resx << " " << resy << endl;
  if(ap == 0){
    resx = resx * -1;
  }
  if(bp == 0){
    resy = resy * -1;
  }
  cout << resx - resy;
}

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.