Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int expresie(int &coefx, int &coefy, int &val);
- int termen(int &coefx, int &coefy, int &val);
- int factor(int &coefx, int &coefy, int &val);
- char s[502],s0[502]; int p=-1;
- bool ok[5000001];
- int expresie(int &coefx, int &coefy, int &val){ int auxcoefx=0, auxcoefy=0, auxval=0; char semn;
- p++;
- termen(auxcoefx, auxcoefy, auxval);
- coefx=auxcoefx; coefy=auxcoefy; val=auxval;
- while(s[p]=='+' || s[p]=='-'){semn=s[p]; p++; termen(auxcoefx,auxcoefy,auxval);
- if(semn=='+'){ coefx+=auxcoefx; coefy+=auxcoefy; val+=auxval;}
- else {coefx-=auxcoefx; coefy-=auxcoefy; val-=auxval;}
- }
- }
- int termen(int &coefx, int &coefy, int &val){ int auxcoefx=0, auxcoefy=0, auxval=0;
- //aici inmultim;
- if(s[p]=='x'){auxcoefx=1; auxcoefy=0; auxval=0; p++;}
- else if(s[p]=='y'){auxcoefx=0; auxcoefy=1; auxval=0; p++;}
- else factor(auxcoefx,auxcoefy,auxval);
- coefx=auxcoefx; coefy=auxcoefy; val=auxval;
- while(s[p]=='*'){
- p++; if(s[p]=='x'){auxcoefx=1; auxcoefy=0; auxval=0; p++;}
- else if(s[p]=='y'){auxcoefx=0; auxcoefy=1; auxval=0; p++;}
- else factor(auxcoefx,auxcoefy,auxval);
- //separare pe cazuri: avem inmultiri de forma (Ax+B)*valoare, valoare*(Ax+B) si analoage ptr y; sau pur si simplu doua numere naturale inmultite
- if(coefx!=0)coefx*=auxval;
- else if(auxcoefx!=0)coefx=auxcoefx*val;
- if(coefy!=0)coefy*=auxval;
- else if(auxcoefy!=0)coefy=auxcoefy*val;
- val*=auxval;
- }
- }
- int factor(int &coefx, int &coefy, int &val){ int auxcoefx=0, auxcoefy=0, auxval=0;
- if(s[p]=='('){expresie(auxcoefx, auxcoefy, auxval); coefx=auxcoefx; coefy=auxcoefy; val=auxval; p++;}
- else{
- int nr=0;
- while(isdigit(s[p])){nr=nr*10+(s[p]-'0'); p++;}
- val=nr;
- }
- }
- int main()
- {
- int coefx,coefy,val,meh1,meh2,val2,i=0,j,len0,len,poz,a,b,c,deverificat,nrsol=0,oky=0,okx,x,y; meh1=meh2=val2=coefx=coefy=val=0;
- cin.getline(s0,257);
- //separare Membru stang
- while(s0[i]!='='){s[i]=s0[i]; i++;}
- // cout<<s<<" ";
- poz=++i; len=strlen(s);
- //daca apare o structura de forma 12x, sau (-5)y, introducem "*" pentru a ne usura munca mai apoi
- //in plus, marchez daca apare y in expresie
- for(i=1;i<len;i++)
- if(strchr("xy",s[i])){
- if(isdigit(s[i-1]) || s[i-1]==')'){
- for(j=len-1;j>=i;j--)
- s[j+1]=s[j];
- s[i]='*';
- len++;
- }
- if(s[i]=='y')oky=1;
- }
- expresie(coefx,coefy,val);
- //resetare s;
- for(i=0;i<len;i++)s[i]=0; p=-1; i=0;
- //reluare proces membru drept, de data fiind mai simplu
- while(s0[poz]){s[i]=s0[poz]; poz++; i++;} len=strlen(s);
- expresie(meh1,meh2,val2);
- //momentam avem coefx*x+coefy*y+val=val2, trecem in ec. de forma coefx*x+coefy*y+val=val, sau a*x+b*y=c;
- c=val2-val; b=coefy; a=coefx;
- // cout<<coefx<<" "<<coefy<<" "<<val<<" "<<val2;
- // cout<<'\n'<<a<<" "<<b<<" "<<c<<" "<<oky<<'\n';
- // migalosenii: verificam daca coeficientii lui x sau/si lui y sunt 0;
- if(!oky || b==0){
- if(a!=0){
- if((c%a)==0){ deverificat=c/a;
- if(deverificat<2)cout<<"No solution";
- for(i=2,okx=1;i*i<=deverificat;i++)if(deverificat%i==0){cout<<"No solution"; okx=0; break;}
- if(okx){cout<<"x="<<deverificat; if(oky)cout<<",y=2";}
- }
- else cout<<"No solution";
- }
- //daca coeficientul lui a este 0
- else {if(c==0 && !oky)cout<<"x=2";
- else if(c==0 && oky)cout<<"x=2,y=2";
- else cout<<"No solution";
- }
- }
- else if(oky && b!=0){
- //ciur! + nu mai verificam numerele divizibile cu 2, pentru a reduce la 5*10^6/2 numarul de posibilitati
- for(i=3;i*i<=5000000;i+=2)
- if(!ok[i])
- for(j=i*i;j<=5000000;j+=i)ok[j]=1;
- //luam fiecare x prim si verificam daca y=(c-a*x)/b e si el prim; sa nu uitam sa verificam daca y e par(!)
- //x=2
- if((c-2*a)%b==0 && (c-a*x)/b >=2){y=(c-2*a)/b; if(y==2 || (ok[y]==0 && y%2==1)){cout<<"x="<<2<<",y="<<y; nrsol=1;} }
- //x prim, >2
- for(x=3;x<=5000000 && !nrsol;x+=2)
- if(!ok[x])
- if((c-a*x)%b == 0 && (c-a*x)/b >= 2) {
- y=(c-a*x)/b; if(y==2 || (ok[y]==0 && y%2==1)){cout<<"x="<<x<<",y="<<y; nrsol=1;}
- }
- if(!nrsol)cout<<"No solution";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement