Относительно ошибки SIGTSTP и бесконечного ввода - PullRequest
0 голосов
/ 26 января 2020

Приведенный ниже код дает SIGTSTP, но я не могу найти ошибку. Оригинальная ссылка на вопрос: https://codeforces.com/contest/102/problem/B. Пожалуйста помоги.

 #include<bits/stdc++.h>
 using namespace std;

  int main()
  {
    int x,sum=0,count=0;
    string s; cin>>s;


    while(s.length()>1){

      for(int i=0;i<s.length();i++){
        x=s[i]-'0';
        sum+=x;
      }
      s=std::to_string(sum);
      count++;
    }


    cout<<count;      
    return 0;
  }

1 Ответ

0 голосов
/ 26 января 2020

Позволяет сказать, что ввод 19.

Первая итерация внешнего l oop сделает sum равным 10 и установит s в "10".

Вторая итерация внешнего l oop (когда s равно "10") добавляет 10) к sum, делая его равным до 11, поэтому, когда внутренние циклы заканчиваются, тогда s становится "11".

Третья итерация внешнего l oop добавит 2 (1 и 1) до sum, поэтому sum становится 13 и s становится "13".

И так далее.

Длина s будет никогда становится равным (или меньшим) 1. И это приводит к бесконечному l oop. Который, вероятно, будет остановлен сетевой системой из-за тайм-аута.

Я не читал описание проблемы (в будущем, пожалуйста, включите его в вопрос, чтобы сделать ваши вопросы автономными), но ваш алгоритм неправильно, и вам нужно пересмотреть свое решение. Очень вероятно, что вы должны сбросить sum (то есть sum = 0;) до внутреннего l oop, или еще лучше определить его внутри внутреннего l oop:

int x,count=0;
string s; cin>>s;

while(s.length()>1){
  int sum = 0;

  for(int i=0;i<s.length();i++){
    x=s[i]-'0';
    sum+=x;
  }
  s=std::to_string(sum);
  count++;
}

[Я объяснил это, выполнив отладку резиновой утки кода]

...