Pagini: [1] 2 3   În jos
  Imprimă  
Ajutor Subiect: Multe "smenuri" de programare in C/C++... si nu numai!  (Citit de 38084 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
stef2n
Nu mai tace
*****

Karma: 218
Deconectat Deconectat

Mesaje: 641



Vezi Profilul
« : Februarie 20, 2009, 01:43:26 »

Comentarii la articolul Multe "smenuri" de programare in C/C++... si nu numai!.
Memorat

Exista 10 categorii de oameni: cei care inteleg sistemul binar si cei care nu il inteleg.
INSiDe123
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 12



Vezi Profilul
« Răspunde #1 : Martie 12, 2009, 14:18:28 »

la functia : inmultirea unui numar mare cu un numar mare

ce inseama memset si memcpy ..
Memorat
gabor_oliviu1991
Nu mai tace
*****

Karma: 28
Deconectat Deconectat

Mesaje: 200



Vezi Profilul
« Răspunde #2 : Martie 12, 2009, 14:24:45 »

memset(vect, x, sizeof(vector)); pune in vect[] pe toate pozitiile elementul x, iar memcpy(A,B,sizeof(B)) copiaza vectorul B in vectorul A.
Memorat
INSiDe123
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 12



Vezi Profilul
« Răspunde #3 : Martie 12, 2009, 14:40:29 »

ok.. ms.. si pt a folosi astea trebuie o inclusa o anumita biblioteca?
Memorat
gabor_oliviu1991
Nu mai tace
*****

Karma: 28
Deconectat Deconectat

Mesaje: 200



Vezi Profilul
« Răspunde #4 : Martie 12, 2009, 14:42:27 »

string.h
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #5 : Martie 12, 2009, 15:03:17 »

memset(vect, x, sizeof(vector)); pune in vect[] pe toate pozitiile elementul x, iar memcpy(A,B,sizeof(B)) copiaza vectorul B in vectorul A.
De fapt nu pune chiar elementul x. Daca x este un byte, e ok, dar daca este int nu functioneaza cum te astepti tu (si in cazul asta cel mai sigur e sa initializezi vectorii cu un for).
Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #6 : Martie 20, 2010, 15:11:05 »

foarte tare Shocked

adica sunt niste algoritmi foarte simpli
eu aveam altii(facuti de mine)  mult mai inceti si mai lungi
multumesc mult  Very Happy
Memorat
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« Răspunde #7 : Martie 27, 2010, 02:13:10 »

Salut!
Am o intrebare.
Daca am un numar mare de 100.000 de cifre in baza 16 si trebuie sa-l tranform in unul in baza 8 ce pot face sa imbunatatesc algoritmul urmator(care ruleaza in 16 secunde pe cand mie imi trebuie maxim 1 secunda):
Cod:
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std;

void div(int A[], int B)
{
      int i, t = 0;
      for (i = A[0]; i > 0; i--, t %= B)
              A[i] = (t = t * 10 + A[i]) / B;
      for (; A[0] >= 1 && !A[A[0]]; A[0]--);
}
void inm(int A[],int B)
{int i,t=0;
    for(i=1;i<=A[0]||t;i++,t/=10)
        A[i]=(t+=B*A[i])%10;
    A[0]=i-1;
}
int mod(int A[], int B)
{
      int i, t = 0;
      for (i = A[0]; i > 0; i--)
              t = (t * 10 + A[i]) % B;
      return t;
}
void inm2(int A[],int nova[],int B)
{int i,t=0;
    for(i=1;i<=A[0]||t;i++,t/=10)
        nova[i]=(t+=B*A[i])%10;
    nova[0]=i-1;
}
void add(int A[],int B[])
{int i,t=0;
 for(i=1;i<=A[0]||i<=B[0]||t;i++,t/=10)
    B[i]=(t+=A[i]+B[i])%10;
 B[0]=i-1;

}
int main()
{
    int i=0;
int a[100005]={0};
int *suma=new int[200000],*produs=new int[200000],*pow16=new int[200000],*rez=new int[200000];
char x;
int k=0;

ifstream fin("hex.in");
    while(fin>>x)
    {k++;
        if(x>='A'&&x<='F')
          a[k]=10+x-'A';
        else
           a[k]=x-'0';
    }

    fin.close();

pow16[1]=1;
pow16[0]=1;
for(i=k;i>=1;i--)                                        //transform in baza 10, numarul in baza 10 va fi vectorul suma care este de forma
    {                                                        // a[1]*16^k+a[2]*16^k-1+... din acest motiv l-am numit suma
    for(int contor=0;contor<=produs[0];contor++)
       produs[contor]=0;
     produs[0]=produs[1]=1;     // iar vectorul produs reprezita rezultatul inmultire dintre a[x] si uterea lui 16 corespunzatoare
    inm2(pow16,produs,a[i]);
    add(produs,suma);                           
    inm(pow16,16);                              // eu nu calculez de k ori puterile lui 16 ci pur si simplu stiind 16^x il aflu pe 16^x+1
    }



 i=0;                                                                    //tranform in baza 8
 while(suma[0]!=0)                          // cat timp numarul in baza 10 este diferit de 0 adica are macar o cifra diferita de 0
  { i++;
  rez[i]=mod(suma,8);                     //restul impartirii la 8

  div(suma,8);                               //impartima numarul in baza 10 la 8

  }

freopen ("hex.out","w",stdout);
  for(k=i;k>=1;k--)
   printf("%d",rez[k]);
printf("\n");

 return 0;

 }
Multumesc anticipat!
« Ultima modificare: Martie 27, 2010, 02:19:54 de către Calin Dragos Ion » Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #8 : Martie 27, 2010, 02:51:00 »

Trebuie sa treci numarul prin baza 2.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« Răspunde #9 : Martie 27, 2010, 10:17:43 »

Trebuie sa treci numarul prin baza 2.
De ce?
Asa merge mai repede?
Memorat
stef2n
Nu mai tace
*****

Karma: 218
Deconectat Deconectat

Mesaje: 641



Vezi Profilul
« Răspunde #10 : Martie 27, 2010, 10:19:30 »

O cifră în baza 16 reprezintă 4 cifre în baza 2. După ce ai transformat în baza 2, poți grupa câte 3 cifre și obții numărul în baza 8.
Memorat

Exista 10 categorii de oameni: cei care inteleg sistemul binar si cei care nu il inteleg.
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« Răspunde #11 : Martie 27, 2010, 23:51:24 »

Daca am 10101 cum impart in cate 3?
asa:
101 01
sau asa :
10 101 ?
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #12 : Martie 28, 2010, 00:04:13 »

De la dreapta la stanga : 10 101. Pornesti de la cifra unitatilor, continui cu a zecilor.. si asa mai departe, si unde nu mai ai biti destui poti completa cu 0'uri in fata.
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #13 : Septembrie 19, 2010, 22:31:12 »

LA "Smenul lui Batog" unde se imparte intervalul in bucati de sqrt ( n ) cum se face query-ul?
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #14 : Septembrie 19, 2010, 22:58:35 »

Pentru intervale de forma k * sqrt(n) , (k + 1) * sqrt(n) ai raspunsul in o(1). Profiti de chestia asta ca sa calculezi cat mai mult din suma intervalului [st,dr] in timp constant si apoi ce ramane poti aduna manual.
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #15 : Septembrie 20, 2010, 08:56:01 »

De fapt calculezi manual cu for de la st pana la primu numar de forma k * sqrt(n). Apoi incepi sa mergi din sqrt(n) in sqrt(n) pana ajungi la cel mai mare numar care e multiplu de sqrt(n) dar mai mic decat dr. De acolo calculezi din nou manual pana la dr. Worst case o sa ai complexitatea 3 * sqrt(n) = O(sqrt(n))
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #16 : Septembrie 20, 2010, 09:14:56 »

Dar nu inteleg un lucru. Sa luam ca exemplu datele din enunt. Un sir A0...15 si un sir B0...3. Sa presupunem ca la inceput toate elementele acestor siruri sunt egale cu 0. Apoi facem update pe intervalul [ 4, 7 ]- sa zicem ca crestem elementele din intervalul asta cu 2- apoi cautam sa gasim suma elementelor din intervalul [ 6, 8 ]. Acest interval are prima parte ( [ 6, 7 ] ) in intervalul [ 4, 7 ] si a doua parte ( [ 8,8 ] ) in intervalul [ 8, 11 ]. Acuma daca vom cauta elementele 6 si 7 in sirul A, acestea vor fi 0, nu? Cand am facut Update pe intervalul [ 4, 7 ] am crescut cu 2 doar B1, elementele din A au ramas nemodificate. Un astfel de exemlu poate fi gasit si cand intervalul a carui suma o cautam contine un interval de forma [ k sqrt(n), (k+1) sqrt(n) ]. Unde gresesc? Din enuntul articolului si din ce ati spus voi nu imi dau seama.
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #17 : Septembrie 20, 2010, 09:24:26 »

Ah, la primul post pe care l-am dat am crezut ca update-urile sunt pe fiecare element nu pe interval. Pai in cazul asta in vectorul B tii minte ce update-uri ai facut (ma rog cred ca iti mai trebuie un vector aici pe care sa tii minte suma initiala pe fiecare bucata). In momentul asta cand faci query-ul pe 6-8, o sa parcurgi manual toate elementele, iar pentru 6 si 7 o sa vezi ca sunt 0 in A insa o sa vezi in B ca ai facut un update pe bucata respectiva si deci o sa aduni la valoarea din A valoarea respectiva din B la fiecare element.
Memorat
Bit_Master
Vorbaret
****

Karma: -49
Deconectat Deconectat

Mesaje: 159



Vezi Profilul
« Răspunde #18 : Octombrie 05, 2010, 18:12:13 »

La functiile acelea de operatie pe numere mari, presupui ca in numar, dincolo de digitii care indica numarul gasesti doar 0. Adica nu putea fi adaptata ca sa functioneze si cand restul digitilor nu-s buni? Ca pierzi mult timp cand egalezi un nr cu 0 sa stai sa faci toate cifrele 0 (in loc sa reglezi direct dimensiunea 0).
« Ultima modificare: Martie 13, 2012, 16:06:37 de către Alexandru-Iancu Caragicu » Memorat
hunter_ionutzzz
Strain


Karma: 2
Deconectat Deconectat

Mesaje: 15



Vezi Profilul
« Răspunde #19 : Februarie 10, 2011, 16:56:05 »

imi zice cnv  ce inseamna step <<= 1  de la cautare binara ? Very Happy
Memorat
blasterz
Nu mai tace
*****

Karma: 92
Deconectat Deconectat

Mesaje: 255



Vezi Profilul
« Răspunde #20 : Februarie 10, 2011, 17:54:43 »

step *= 2;

e operatie pe biti.. a << b inseamna a * (2^b)
iar a >> b inseamna a / (2^b)
Memorat
lucian666
Client obisnuit
**

Karma: 16
Deconectat Deconectat

Mesaje: 84



Vezi Profilul
« Răspunde #21 : Iulie 01, 2011, 14:23:58 »

am o intrebare;la primul exemplu cel cu indexarea de la -100;
daca vreau sa indexez un vector de frecventa care memoreaza valori de la -1000 pana la 1000;
int a[2001];
#define a( a + 1000)
este corect?
Memorat
Magnus
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 57



Vezi Profilul
« Răspunde #22 : Iulie 01, 2011, 16:37:49 »

da, e corect
Memorat
Doru_AC
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #23 : Iulie 05, 2011, 19:06:36 »

My first comment agent

Ce face linia
Cod:
for (; A[0] > 1 && !A[A[0]]; A[0]--); ?
?

Ce inseamna A[A[0]] ?
Ms !

Later Edit : Mi-am dat seama.
« Ultima modificare: Iulie 05, 2011, 21:06:13 de către Gabriel Bitis » Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #24 : August 02, 2011, 15:13:11 »

elimina zerourile care raman in plus la inceputul numarului (care practic e sfarsitul pentru ca la operatii pe numere mari trebuie rotite mai intai numerele)
Smile
Memorat
Pagini: [1] 2 3   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines