Parsarea Numerelor

Sunt probleme care au datele de intrare mari (ex. 1 milion de numere), la care citirea simpla nu intra in timp, sau pur si simplu ne ia prea mult din timpul de rezolvare efectiva a problemei. Solutia e simpla: se poate parsa citirea, adica se citeste cate un bloc de caractere si apoi se parcurge caracter cu caracter.

Numere naturale

#define DIM 10000
char buff[DIM];
int poz=0;

void citeste(int &numar)
{
     numar = 0;
     //cat timp caracterul din buffer nu e cifra ignor      
     while (buff[poz] < '0' || buff[poz] > '9')     
          //daca am "golit" bufferul atunci il umplu
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     //cat timp dau de o cifra recalculez numarul          
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
}

Numere intregi

#define DIM 10000
char buff[DIM];
int poz=0;

void citeste(int &numar)
{
     numar = 0;
     char semn='+';     
     while (buff[poz] < '0' || buff[poz] > '9')
     {     
          semn = buff[poz];
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     }          
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
     if (semn == '-')
          numar = -numar;
}

in plus mai este o smecherie pentru numere intregi functia atoi din stdlib.h

void citeste(int &numar)
{
     fgets(buff,32,stdin);     
     numar = atoi(buff);
}

acest cod functioneaza cand numerele apar pe randuri diferite

Numere reale

#define DIM 10000
char buff[DIM];
int poz=0;


void citeste(double &numar)
{
     numar = 0;
     char semn='+';
     //caut inceputul numarului     
     while (buff[poz] < '0' || buff[poz] > '9')
     {     
          semn = buff[poz];
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     }          
     //citesc partea de dinainte de virgula
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
     //daca are virgula citesc si partea de dupa
     if (buff[poz] == '.')
     {
          double tmp,cnt;
          tmp = 0;
          cnt = 1;
          ++poz;
          while ('0'<=buff[poz] && buff[poz]<='9')
          {
               cnt = cnt/10;
               tmp = tmp + cnt*(double(buff[poz]-'0'));
               if (++poz == DIM) 
                    fread(buff,1,DIM,stdin),poz=0;               
          }
          numar += tmp;                    
     }
     //daca are semnul minus il fac negativ
     if (semn == '-')
          numar = - numar;
}