Кајгана CodeOpen. Reopened!

  • Креатор на темата Креатор на темата back_rest
  • Време на започнување Време на започнување
Статус
Затворена за нови мислења.
Код:
public int d(int m, int n){

    int k = 0;

    for(int i=2; i<=m/2; i++){
      if( ((m%i)==0) && ( (m%Math.pow(i,n)) != 0) ){
          k++;
      }
    }

    return k;

  }
  
  public int coolDivisors(int a, int b, int n){
    
    int zbir = 0;

    for(int i=0; i<=b; i++){
      zbir += d(a+i, n);
    }
    
    return zbir;
  }
За 15 мин. ќе го пропуштев рокот :)
 
И сеа кој победи?
 
Вака, диме прв даде одговор, ама за жал brute force. 2 поени
јас, даде најоптимизиран алгоритам (линеаред) и добива 3 поени!
Димитар даде точен одговор 1 поен

deXterche и loverboy дадоа точни одговори, ама го пропуштија рокот за кодот. Сепак бидејќи и двајцата се излизгаа со кодови па потоа ги избришаа (модератор пауер!!!), ќе им дадам по еден поен.

Значи, моментална ранг листа:
јас - 3 поени
диме - 2 поени
Димитар - 1 поен
deXterche - 1 поен
loverboy - 1 поен

јас: имаш мандат за наредна задача.

Совет: не користете Math.pow(). Многу е бавен. Наместо p = Math.Pow(a,b) користете:
Код:
int p = 1;
for (int i=0; i<b; i++) p*=a;

А еве го моето решение, многу слично со она на јас:
Код:
public int coolDivisors(int a, int b, int n) {
      
      int mBrojka=0;
      int gore,dole;
      long nTa;
      for (int i=2; i<=(a+b)/2;i++)
      {
          gore = (a+b)/i;
          dole = (a-1)/i;
          mBrojka+=gore-dole;
          if (i>=a && i<=(a+b)) mBrojka--;
          nTa = 1;
          for (int j=0; j<n && (a+b)>=nTa; j++)
              nTa*=i;
          
          gore = (int)((a+b)/nTa);
          dole = (int)((a-1)/nTa);
          mBrojka-=gore-dole;
      }
      return mBrojka;
  }

п.с. сега и јас ќе ги решавам задачите (како стигнам), ама не си ставам поени како и да е.
 
Совет: не користете Math.pow(). Многу е бавен. Наместо p = Math.Pow(a,b) користете:
Код:
int p = 1;
for (int i=0; i<b; i++) p*=a;
А еве го моето решение, многу слично со она на јас:...

Фала за советот. Мислев дека Math.pow() е побрз од „рачното“ пресметување.

Ќе сакате ти или јас (hehe) да го објасните малце алгоритамот?
 
Вака, диме прв даде одговор, ама за жал brute force. 2 поени
јас, даде најоптимизиран алгоритам (линеаред) и добива 3 поени!
Димитар даде точен одговор 1 поен

deXterche и loverboy дадоа точни одговори, ама го пропуштија рокот за кодот. Сепак бидејќи и двајцата се излизгаа со кодови па потоа ги избришаа (модератор пауер!!!), ќе им дадам по еден поен.

Значи, моментална ранг листа:
јас - 3 поени
диме - 2 поени
Димитар - 1 поен
deXterche - 1 поен
loverboy - 1 поен

јас: имаш мандат за наредна задача.

Совет: не користете Math.pow(). Многу е бавен. Наместо p = Math.Pow(a,b) користете:
Код:
int p = 1;
for (int i=0; i<b; i++) p*=a;
А еве го моето решение, многу слично со она на јас:
Код:
public int coolDivisors(int a, int b, int n) {
      
      int mBrojka=0;
      int gore,dole;
      long nTa;
      for (int i=2; i<=(a+b)/2;i++)
      {
          gore = (a+b)/i;
          dole = (a-1)/i;
          mBrojka+=gore-dole;
          if (i>=a && i<=(a+b)) mBrojka--;
          nTa = 1;
          for (int j=0; j<n && (a+b)>=nTa; j++)
              nTa*=i;
          
          gore = (int)((a+b)/nTa);
          dole = (int)((a-1)/nTa);
          mBrojka-=gore-dole;
      }
      return mBrojka;
  }
п.с. сега и јас ќе ги решавам задачите (како стигнам), ама не си ставам поени како и да е.

Циклусот и не е баш некој брз начин за степен (напротив поспор е од pow), ама кај тебе доброто е шо го прекинваш навреме со условот за горна граница и кај многу од циклусите не се осеќа.

За задача ќе размислам некој ден и ќе ви дам. Ќе ве предупредам со време кога да чекате. Сега чао :salut:

@ dime: Jas zaminvam (opravdano). ako mu se objasnuva na ksilomedus slobodno neka ti kazva ako ne jas utre kje napisam nekoe objasnuvanje. Zasega ne e loso sam da desifriras (taka se uci ;))
 
...@ dime: Jas zaminvam (opravdano). ako mu se objasnuva na ksilomedus slobodno neka ti kazva ako ne jas utre kje napisam nekoe objasnuvanje. Zasega ne e loso sam da desifriras (taka se uci ;))

Не, кодот не е проблем. Ми треба математичко објаснување :) .
 
Не, кодот не е проблем. Ми треба математичко објаснување :) .

:)
Зарем не си сватил сеуште дека пишувањето на кодот е најлесниот дел од програмирањето.

Та цела финта е во математичкото
 
Совет: не користете Math.pow(). Многу е бавен. Наместо p = Math.Pow(a,b) користете:
Код:
int p = 1;
for (int i=0; i<b; i++) p*=a;
пробај го примеров со вредности а=256, б=4 :)

Хм, спрема бројките кои ги задаваме не може да се користи ова. Премногу е мал integer-от. Океј, можеби long но тогаш нема да има некоја голема разлика со тоа да ја користиме функцијата Math.pow (мислам во брзината)
 
Се извинувам шо не стигнав порано, сега еве ставам, синоќа бев на шетња :) Можеби е доцна ама морам да си го пастирам кодчето мое, хехе.
Код:
public static int stepen(int a, int b) {
    int pom=1,i;
    for (i=1;i<=b;i++) {
      if ((2147483647/pom)>=a) {
        pom=pom*a;
      } else {
        return(-1);
      }
      
    }
    return pom;
  }
  
  public static int coolDivisors(int a, int b, int n) {
    int i,rez=0;
    if ((a+b)<=3500) {
      for (i=2;i<=(a+b);i++) {
      
        // za sekoj mozen broj proveruva
        rez=rez+(a+b)/i-(a-1)/i;
        if (stepen(i,n)!=(-1)) {
          rez=rez-(a+b)/stepen(i,n)+(a-1)/stepen(i,n);  
        }
      }
    } else {
      for (i=2;i<=3500;i++) {
        // za sekoj mozen broj proveruva
        rez=rez+(a+b)/i-(a-1)/i;
        if (stepen(i,n)!=(-1)) {
          rez=rez-(a+b)/stepen(i,n)+(a-1)/stepen(i,n);  
        }
      }
      if (((a+b)/n)<=3500) {
        for (i=3501;i<=(a+b);i++) {
          // za sekoj mozen broj proveruva
          rez=rez+(a+b)/i-(a-1)/i;
        }
      } else {
        for (i=3501;i<=(a+b)/n;i++) {
          rez=rez+(a+b)/i-(a-1)/i;
        }
        rez=rez+a+b-i+1;
      }
    }
    
    if (a!=1) {
        rez=rez-(b+1);
    } else {
      rez=rez-b;
    }
    
    return rez;
  }
Ова е всушност оптимизиран brute force :)
Поздрав
 
Код:
private int coolDivisors(int a, int b, int c)
        {       
            int = 0;
            for (int i=0; i<=b; i++)
            zbir += d(a + i);
            return zbir;
        }
        private int d(int vnes)
        {
            int deliteli = 0;
            for (int j = 1; j <= vnes/2; j++)
            if (vnes % j == 0 && (vnes % Math.Pow(j, c) != 0))
            deliteli++;
            return deliteli;
        }
Уште јас останав со кодот, сношти бев излезен нестигнав да го ставам кодот. Класика brute force, а знаев дека има некоја математика:nesum:
 
:)
Зарем не си сватил сеуште дека пишувањето на кодот е најлесниот дел од програмирањето.

Та цела финта е во математичкото

Знам дека кодот е најлесниот дел :) Ама во моја одбрана, мислам дека не сум учел математика која би ми помогнала при овој пример :) затоа барам и математичко објаснување за да ја разберам задачата.
 
Знам дека кодот е најлесниот дел :) Ама во моја одбрана, мислам дека не сум учел математика која би ми помогнала при овој пример :) затоа барам и математичко објаснување за да ја разберам задачата.

Нема математика. Размислувај обратно: наместо за секој број од а до а+б да бараш колку делители има, за секој број од 2 до (а+б)/2 барај колку пати се содржи во опсегот а до а+б. Ајде размисли уште малце, верувам ќе ти текне.

п.с. совет: кога ви се бара број на броеви, ви се бара само бројот! ако во вашето решение вие ги добивате и самите броеви, тогаш грешка размислувате - има некоја финта. Секојпат концентрирајте се на она што се бара. Ако добивате некои други податоци за тоа како е добиен резултатот, грешка сте тргнале со работа.

пробај го примеров со вредности а=256, б=4 :)

Хм, спрема бројките кои ги задаваме не може да се користи ова. Премногу е мал integer-от. Океј, можеби long но тогаш нема да има некоја голема разлика со тоа да ја користиме функцијата Math.pow (мислам во брзината)
Види сега, од лично искуство имам приметено дека Math.pow е сериозно бавна (во Java зборам). Не знам зошто ама скоро во секоја задача кога го елиминирам Math.pow добивам повеќекратно подобри перформанси. Е сега во конкретниот пример и кратам во циклусот, ама тоа е друга приказна. Ми објаснуваа еднаш као демек имало глупа математика во Math.pow која што била оптимизирана за некои вредности, а за останатите била крепи. Не е битно.
 
Кога ќе биде втората задача?
 
Кога ќе биде втората задача?
За некој ден, се мислам со каква тежина да биди задачата. Ама без гајле неколку саати предвреме ќе ви кажам кога ќе ја објавам за да знајте сите кога да ја земите и да почните истовремено.
 
Aj би требало да учестувам и јас ако бидам послободен , супер ова сега го видов дури :helou:
 
Статус
Затворена за нови мислења.

Kajgana Shop

Back
На врв Bottom