codice:#include <iostream> #include <stdlib.h> #include <algorithm> #include <string> #include <ctype.h> #include <vector> #define DEBUG //#define TEST using namespace std; //123: Cifre[0]=3; Cifre[1]=2; Cifre[2]=1; class Numero { public: int* Cifre; int Len; int PosVirgola; Numero() { Numero(0); } Numero (int len) { PosVirgola=0; Len=len; Cifre=new int[len]; //Azzera for (int i=0;i<len;i++) Cifre[i]=0; } //Si puo' non utilizzare len Numero (int len,int n) { PosVirgola=0; if (len==-1) Len=Numero::LenNumero(n); else Len=len; Cifre=new int[Len]; int i=0; while (n>0) { Cifre[i++]=(n%10); n/=10; } } int& operator[](int a) { return Cifre[a]; } static int LenNumero(int a); }; ostream& operator<<(ostream& s, Numero a) { int Zero=0; while (Zero<a.PosVirgola && a[Zero]==0) Zero++; bool PrintVirgola=true; if (Zero==a.PosVirgola)PrintVirgola=false; int j=a.Len-1; if (a.Len==a.PosVirgola) s<<"0."; while (j>=Zero) { s<<a[j]; if ((j==a.PosVirgola) && PrintVirgola) s<<"."; j--; } return s; } istream& operator>>(istream& s, Numero& a) { //Legge tutti gli eventuali spazi iniziali char c; while ((s.get(c)) && (isspace(c))); int* Arr=new int[1000]; int i=0; int PosVirgolaEnd=-1; do { if (c=='.') PosVirgolaEnd=i; else Arr[i++]=c-'0'; } while((s.get(c)) && (!isspace(c))); //Sistema la virgola a=Numero(i); if (PosVirgolaEnd==-1) a.PosVirgola=0; else a.PosVirgola=i-PosVirgolaEnd; //Sistema le cifre for (int j=0;j<i;j++) { //Scambia a.Cifre[i-j-1]=Arr[j]; } return s; } int Numero::LenNumero(int a) { int Cont=0; while (a>0) { a/=10; Cont++; } return Cont; } Numero operator + (Numero a,Numero b) { //Inizializza Numero Ret(max(a.Len,b.Len)+1); //Somma cifra per cifra int Resto=0; int j=0; for(j=0;j<min(a.Len,b.Len);j++) { int Somma=a.Cifre[j]+b.Cifre[j]; Ret.Cifre[j]=(Somma+Resto)%10; if (Somma+Resto>=10) Resto=1; else Resto=0; } //bool Enter=false; while (j<max(a.Len,b.Len)) { int Somma=(a.Len>b.Len)?(a.Cifre[j]):(b.Cifre[j]); Ret.Cifre[j]=(Somma+Resto)%10; if (Somma+Resto>=10) Resto=1; else Resto=0; j++; } if (Resto==0) Ret.Len--; else Ret[Ret.Len-1]=1; return Ret; } Numero operator * (Numero a,Numero b) { #ifdef DEBUG cout<<a<<b; #endif Numero ProdN(1,0); int ProdNDec=0; for (int i=0;i<b.Len;i++) { Numero Somma(-1,0); int Dec=0; for(int j=0;j<a.Len;j++) { Numero TT(-1,b[i]*a[j]);int TTCont=TT.Len-1; Numero Temp(TT.Len+Dec); for (int k=Temp.Len-1;k>=0;k--) { if (TTCont>=0) Temp[k]=TT[TTCont--]; else Temp[k]=0; } Somma= Somma+Temp; Dec++; } Numero SommaTemp(Somma.Len+ProdNDec); int SommaCont=Somma.Len-1; for (int k=SommaTemp.Len-1;k>=0;k--) { if(SommaCont>=0) SommaTemp[k]=Somma[SommaCont--]; else SommaTemp[k]=0; } #ifdef DEBUG //cout<<"SommaTemp:"<<SommaTemp<<"\n"; #endif ProdN=ProdN+SommaTemp; ProdNDec++; } ProdN.PosVirgola=a.PosVirgola+b.PosVirgola; return ProdN; } Numero Potenza(Numero r,int ex) { Numero Ret(1); Ret[0]=1; Ret.PosVirgola=0; for(int i=0;i<ex;i++) { Ret=Ret*r; #ifdef DEBUG //cout<<r<<" "<<ex<<" Esponente("<<i<<"):"<<Ret<<"\n"; #endif } return Ret; } void Test() { /*Numero a(3); Numero b(2); a.PosVirgola=2; b.PosVirgola=1; a[0]=9; a.Cifre[1]=0; a.Cifre[2]=1; b.Cifre[0]=1; b.Cifre[1]=1; Numero Res=a*b;*/ Numero a; Numero n; cin>>a>>n; cout<<a+n; } int main(void) { #ifdef TEST Test(); #else int cont=0; int n; Numero s; vector<Numero> Res; while(cin>>s>>n) { Res.push_back(Potenza(s,n)); cout<<Res[Res.size()-1]<<"\n"; } for(int i=0;i<Res.size();i++) cout<<Res[i]; #endif return 0; }

Rispondi quotando