Member 14925633 Ответов: 3

Проблема с кодом ошибки тайм-аута в одном вопросе C++


Всем привет:)
Я получаю код ошибки таймаута в этом коде.Кто-нибудь, пожалуйста, помогите мне
int plenti(int n)
{
    int sum=0,a;
   for(int i=1;i<=n;i++)
   {
       int sum1=0;
       if(i==1)
       {
           continue;
       }
       for(int j=1;j<i;j++)
       {
            a=0;
           if(i%j==0)
           {
               sum1=sum1+j;
           }
           if(sum1>i)
           {
               a=i;
               sum=sum+a;
               break;
           }
           else
           {
               a=0;
           }
       }
   }
   return sum;
}


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

Я попытался реализовать этот код

KarstenK

совет: ваше обращение с а можно улучшить

3 Ответов

Рейтинг:
22

Dave Kreskowiak

На сайтах с вызовами простой, прямой код никогда не является правильным ответом.

Это проблемы, которые заставляют вас думать о различных способах решения проблем. Обычно, если у вас есть циклы внутри циклов, вы пишете самый простой для понимания код, но он также выполняется медленнее всего.

Выбросьте свой код и переосмыслите, как вы подходите к проблеме. То, что вы написали, никогда не будет работать достаточно быстро, чтобы пройти тест.


Patrice T

+5

Рейтинг:
2

Greg Utas

Если вы когда-нибудь решите снова отправить код, Пожалуйста, будьте любезны прокомментировать его.

Комментарий выглядит примерно так:

//  The following code does blah blah blah...
Я взглянул на код, но у меня не хватило терпения после ужина с вином попытаться понять, что он пытается сделать, что, к сожалению, является необходимым условием для того, чтобы быть в состоянии помочь. Конечно, я мог бы потратить много минут, изучая его, но, честно говоря, я не мог бы беспокоиться, когда он даже не прокомментирован.

Edit1: Спасибо за описание того, что пытается сделать ваш код. Вот некоторые предложения:

1. Как вы могли бы устранить if(i == 1) проверить?
2. Если вы удалили a всецело, как ты мог писать sum = sum + a?
3. если 1 разрешен в качестве делителя, как вы можете упростить инициализацию sum1 и for(int j = 1…) петля?
4. В for(int j = 1, j < i…), как вы могли бы уменьшить максимальное значение j?

Edit2: Если бы вы знали результат i/j, какова была бы точка остановки for(int j…) петля?

Вероятно, существуют и другие оптимизации, основанные на анализе, такие как числа, которые могут быть немедленно исключены, если они не делятся на 2 и 3, но это начинает затягивать столько же математики, сколько и программного обеспечения, что может и не быть намерением.


Member 14925633

Я должен найти сумму всех чисел, сумма делителей которых больше этого числа .
N-это число, до которого я должен узнать сумму

Greg Utas

Спасибо. См. предложения, отредактированные в вышеприведенном посте.

Рейтинг:
18

Patrice T

Цитата:
Кто-нибудь, пожалуйста, помогите мне

- Помочь чему ?
Цитата:
Я получаю код ошибки таймаута в этом коде.

Это сообщение об ошибке типично для сайтов проблем, оно просто означает, что выполнение кода занимает слишком много времени.
Вы просто забыли сказать, какой сайт и какую проблему вы пытаетесь решить.
Без них невозможно оказать какую-либо помощь.

Единственное, что ваш код слишком упрощен, и они хотят, чтобы вы дали лучшее решение, быстрее.
[Обновление]
даже если это не решение, я бы начал с упрощения кода:
int plenti(int n) {
    int sum=0,a;
    for(int i=1;i<=n;i++) {
        int sum1=0;
        if(i==1) {
            continue;
        }
        for(int j=1;j<i;j++) {
            a=0;
            if(i%j==0) {
                sum1=sum1+j;
            }
            if(sum1>i) {
                a=i;
                sum=sum+a+i;
                break;
            }
            else {
                a=0;
            }
        }
    }
    return sum;
}