Кајгана CodeOpen. Reopened!

Статус
Затворена за нови мислења.

диме

When Am I ?
Член од
14 февруари 2007
Мислења
806
Поени од реакции
21
Код:
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 мин. ќе го пропуштев рокот :)
 

nelo

Смрта е сигурна, животот не е!
Член од
29 мај 2008
Мислења
109
Поени од реакции
0
И сеа кој победи?
 

back_rest

ex mod coder
Член од
19 јули 2006
Мислења
1.590
Поени од реакции
107
Вака, диме прв даде одговор, ама за жал 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;
  }
п.с. сега и јас ќе ги решавам задачите (како стигнам), ама не си ставам поени како и да е.
 

диме

When Am I ?
Член од
14 февруари 2007
Мислења
806
Поени од реакции
21
Совет: не користете Math.pow(). Многу е бавен. Наместо p = Math.Pow(a,b) користете:
Код:
int p = 1;
for (int i=0; i<b; i++) p*=a;
А еве го моето решение, многу слично со она на јас:...
Фала за советот. Мислев дека Math.pow() е побрз од „рачното“ пресметување.

Ќе сакате ти или јас (hehe) да го објасните малце алгоритамот?
 
Член од
22 февруари 2007
Мислења
7.076
Поени од реакции
1.940
Вака, диме прв даде одговор, ама за жал 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 ;))
 

диме

When Am I ?
Член од
14 февруари 2007
Мислења
806
Поени од реакции
21
...@ 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 ;))
Не, кодот не е проблем. Ми треба математичко објаснување :) .
 

Dr_ViRuS

DarkSide with green light
Член од
9 јануари 2006
Мислења
1.076
Поени од реакции
28
Не, кодот не е проблем. Ми треба математичко објаснување :) .
:)
Зарем не си сватил сеуште дека пишувањето на кодот е најлесниот дел од програмирањето.

Та цела финта е во математичкото
 
Член од
19 септември 2005
Мислења
5.616
Поени од реакции
180
Совет: не користете 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 (мислам во брзината)
 
Член од
12 јуни 2008
Мислења
11
Поени од реакции
0
Се извинувам шо не стигнав порано, сега еве ставам, синоќа бев на шетња :) Можеби е доцна ама морам да си го пастирам кодчето мое, хехе.
Код:
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 :)
Поздрав
 

deXterche

тадаммм
Член од
12 февруари 2006
Мислења
4.920
Поени од реакции
941
Код:
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:
 

диме

When Am I ?
Член од
14 февруари 2007
Мислења
806
Поени од реакции
21
:)
Зарем не си сватил сеуште дека пишувањето на кодот е најлесниот дел од програмирањето.

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

back_rest

ex mod coder
Член од
19 јули 2006
Мислења
1.590
Поени од реакции
107
Знам дека кодот е најлесниот дел :) Ама во моја одбрана, мислам дека не сум учел математика која би ми помогнала при овој пример :) затоа барам и математичко објаснување за да ја разберам задачата.
Нема математика. Размислувај обратно: наместо за секој број од а до а+б да бараш колку делители има, за секој број од 2 до (а+б)/2 барај колку пати се содржи во опсегот а до а+б. Ајде размисли уште малце, верувам ќе ти текне.

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

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

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

nelo

Смрта е сигурна, животот не е!
Член од
29 мај 2008
Мислења
109
Поени од реакции
0
Кога ќе биде втората задача?
 
Член од
22 февруари 2007
Мислења
7.076
Поени од реакции
1.940
Кога ќе биде втората задача?
За некој ден, се мислам со каква тежина да биди задачата. Ама без гајле неколку саати предвреме ќе ви кажам кога ќе ја објавам за да знајте сите кога да ја земите и да почните истовремено.
 
Член од
28 јануари 2007
Мислења
9.850
Поени од реакции
1.559
Aj би требало да учестувам и јас ако бидам послободен , супер ова сега го видов дури :helou:
 
Статус
Затворена за нови мислења.

Kajgana Shop

На врв Bottom