Информация об изменениях

Сообщение Re: Помогите Васе от 25.06.2015 18:54

Изменено 25.06.2015 20:27 watchmaker

Здравствуйте, olimp_20, Вы писали:

_>    while(j>0){    
_>        int x = j*j*j;        
_>        if(n - x < 0) continue;

Странный оператор continue. Если он реализуется хоть раз, то никакие переменные не изменят свои значения, а цикл будет вечным.

_>    int j=pow(n*1.0, 1.0/3.0);//начать поиск с чила, куб которого меньше либо равно n

Слишком большая верхняя граница перебора. И нет нужды рассматривать перестановки слагаемых. Куда лучше будет, если по-прежнему сохранить требование j³ ≤ n, но при этом потребовать чтобы одновременно j не превосходило предыдущего взятого значения (a[i-1], если оно определено, конечно).


_>    while(j>0){

Нижняя граница слишком низка — незачем перебирать все малые x, если их суммы заведомо не хватит для достижения n.
Re: Помогите Васе
Здравствуйте, olimp_20, Вы писали:

_>    while(j>0){    
_>        int x = j*j*j;        
_>        if(n - x < 0) continue;

Странный оператор continue. Если он реализуется хоть раз, то никакие переменные не изменят свои значения, а цикл будет вечным.

_>    int j=pow(n*1.0, 1.0/3.0);//начать поиск с чила, куб которого меньше либо равно n

Слишком большая верхняя граница перебора. И нет нужды рассматривать перестановки слагаемых. Куда лучше будет, если по-прежнему сохранить требование j³ ≤ n, но при этом потребовать чтобы одновременно j не превосходило предыдущего взятого значения (a[i-1], если оно определено, конечно).
Ну и округление вещественного числа в этой строке сделано плохо. Так, например, в некоторых очень популярных реализациях (int)pow(125*1.0, 1.0/3.0) == 4, хотя кубический корень из 125 равен 5.


_>    while(j>0){

Нижняя граница слишком низка — незачем перебирать все малые x, если их суммы заведомо не хватит для достижения n.