#c
Вопрос:
В проблеме UVA «100 Проблема 3n 1», когда я отправляю код, в нем говорится об ошибке во время выполнения. Код написан на языке C
Я перепробовал много вещей, но все еще не могу решить эту проблему
#include <iostream>
#include <algorithm>
#define ll long long
#define N 10000
using namespace std;
int main(){
int cont = 0, aux = 0;
ll n1, n2, m;
ll dp[N] = {0};
while (cin >> n1 >> n2) {
cout << n1 << " " << n2 << " ";
if(n1 > n2)
{
m = n2;
n2 = n1;
n1 = m;
}
for (ll i = n1; i <= n2; i ) {
ll num = i;
if (num == 1) {
cont = 1;
}
else{
if (dp[num] != 0){
cont = dp[num];
}
else {
while (num >= 1){
if (num == 1) {
cont = 1;
break;
}
if (num%2 != 0){
num = (3 * num) 1;
}
else{
num = num/2;
}
cont = 1;
}
dp[num] = cont;
}
}
aux = max(aux, cont);
cont = 0;
}
cout << aux << "n";
aux = 0;
}
}
Комментарии:
1. Вы запустили свою программу через valgrind? Компилировать с включенными дезинфицирующими средствами? Что-нибудь, что поможет выяснить, откуда берется ошибка во время выполнения?
2.
Runtime error
нам недостаточно информации, чтобы помочь вам. Пожалуйста, уточните подробнее.3. Рассмотрите возможность использования fuzzing для поиска случая сбоя, а затем запустите программу через отладчик с этим случаем сбоя.
4. Проблема, возможно, в
dp[N]
том, что она создает массив только из0->9999
5. Я не могу воспроизвести вашу ошибку. Однако обратите внимание, что даже если они скажут: «Все целые числа будут меньше 10 000 и больше 0». Они могут лгать. Пожалуйста, также обратите внимание, что вы вообще не используете запоминание, так как строка
dp[num] = cont;
находится после циклаwhile (num >= 1){ if (num == 1) {... break;} ... }
. Внутри этого циклаnum
может стать (намного) больше 10000, но снаружи…
Ответ №1:
Ограничение на ввод составляет 1 000 000 (а не 10 000). Предел указан неверно.
Аналогичная проблема: https://www.spoj.com/problems/PROBTNPO/