Advertisement
_martin

polynom division

Nov 13th, 2022
860
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <stdlib.h>
  5. #include <ctype.h>
  6. #include <math.h>
  7. #include <stdexcept>
  8. #include <iomanip>
  9. #define Size 100
  10.  
  11. using namespace std;
  12.  
  13. class polinom{
  14.     private:
  15.         double data[Size];
  16.         int n;
  17.         friend const polinom mult(const polinom&, const double, const int);
  18.         friend void div(polinom&, polinom&, const polinom&);
  19.         void parse(string s);
  20.     public:
  21.         polinom();
  22.         polinom(const double);
  23.         polinom(const string);
  24.         polinom(const polinom&);
  25.        
  26.         void fread(fstream&);
  27.         void fwrite(ofstream&) const;
  28.         void read();
  29.         void write() const;
  30.        
  31.         const polinom& operator = (const polinom&);
  32.         friend const polinom operator + (const polinom&, const polinom&);
  33.         friend const polinom operator - (const polinom&, const polinom&);
  34.         friend const polinom operator * (const polinom&, const polinom&);
  35.         friend const polinom operator / (const polinom&, const polinom&);
  36.         friend const polinom operator % (const polinom&, const polinom&);
  37.         friend const polinom operator * (const polinom&, const double);
  38.         friend const polinom operator / (const polinom&, const double);
  39.        
  40.         friend bool operator == (const polinom&, const polinom&);
  41.         friend bool operator != (const polinom&, const polinom&);
  42.        
  43.         friend const polinom power(const polinom&, int);
  44.         friend const polinom sqrt(const polinom&);
  45.         const double value(double);
  46.            
  47.         void zero();
  48.         bool issquare();
  49.         friend void fprint_div(ofstream&, const polinom&, const polinom&);
  50. };
  51.  
  52. int maxof(int a, int b){
  53.     return (a>b)?a:b;
  54. }
  55.  
  56. bool polinom::issquare(){
  57.     int min=0,i;
  58.     if(n&1) return false;
  59.     while(data[min]==0) min++;
  60.     if(min==n) return !(min&1);
  61.     if(min&1) return false;
  62.     for(i=0;i<n;i++)
  63.         if(i!=min && i!=(n+min)/2)
  64.             if(data[i]!=0) return false;
  65.     return (fabs(data[(n+min)/2])!=2*sqrt(data[min]*data[n]));
  66. }
  67.  
  68. void polinom::zero(){
  69.     for(int i=0;i<=n;i++) data[i]=0;
  70.     n=0;
  71. }
  72.  
  73. const polinom sqrt(const polinom& arg){
  74.     int min,max;
  75.     polinom tmp=arg,res;
  76.     if(!tmp.issquare()) return tmp;
  77.     max=tmp.n;
  78.     min=0;
  79.     while(tmp.data[min]==0) min++;
  80.     res.data[max/2]=sqrt(tmp.data[max]);
  81.     res.data[min/2]=sqrt(tmp.data[min/2]);
  82.     res.n=max/2;
  83.     return res;
  84. }
  85.  
  86. const double polinom::value(double d){
  87.     int i;
  88.     double m=1,res=0;
  89.    
  90.     for(i=0;i<=n;i++){
  91.         res+=data[i]*m;
  92.         m*=d;
  93.     }
  94.     return res;
  95. }
  96.  
  97. const polinom power(const polinom& arg, int t){
  98.     int n=t;
  99.     polinom res(1),tmp=arg;
  100.     while(n){
  101.         if(n&1) res=res*tmp;
  102.         tmp=tmp*tmp;
  103.         n>>=1;
  104.     }
  105.     return res;
  106. }
  107.  
  108. void polinom::parse(string s){
  109.     int i,sign,t;
  110.     double d;
  111.    
  112.     for(i=0;i<(int)s.length();i++)
  113.         while(s[i]==' ')
  114.             s.erase(i,1);
  115.     while(s.length()>0){
  116.         i=0;
  117.         sign=1;
  118.         if(s[0]=='-')
  119.             sign=-1;
  120.         if(s[0]=='-' || s[0]=='+') s.erase(0,1);
  121.         while(i<(int)s.length() && (isdigit(s[i]) || s[i]=='.')) i++;
  122.         if(i==s.length() || (s[i]!='*' && i!=0)){
  123.             d=atof(s.substr(0,i).c_str());
  124.             s.erase(0,i);
  125.             data[0]=d*sign;
  126.             continue;
  127.         }
  128.         if(s[i]=='*'){
  129.             d=atof(s.substr(0,i).c_str());
  130.             s.erase(0,i+2);
  131.         }
  132.         else{
  133.             d=1;
  134.             s.erase(0,1);
  135.         }
  136.         if(s.length()>0 && s[0]=='^'){
  137.             s.erase(0,1);
  138.             i=0;
  139.             while(i<(int)s.length() && isdigit(s[i])) i++;
  140.             t=atoi(s.substr(0,i).c_str());
  141.             s.erase(0,i);
  142.         }
  143.         else
  144.             t=1;
  145.         data[t]=d*sign;
  146.         if(t>n) n=t;
  147.     }
  148. }
  149.  
  150. polinom::polinom(){
  151.     n=0;
  152.     for(int i=0;i<Size;i++)
  153.         data[i]=0;
  154. }
  155.  
  156. polinom::polinom(const double d){
  157.     n=0;
  158.     for(int i=0;i<Size;i++)
  159.         data[i]=0;
  160.     data[0]=d;
  161. }
  162.  
  163. polinom::polinom(const string s){
  164.     string tmp=s;
  165.     n=0;
  166.     for(int i=0;i<Size;i++)
  167.         data[i]=0;
  168.     parse(tmp);
  169. }
  170.  
  171. polinom::polinom(const polinom& arg){
  172.     for(int i=0;i<=n;i++)
  173.         data[i]=0;
  174.     n=arg.n;
  175.     for(int i=0;i<=n;i++)
  176.         data[i]=arg.data[i];
  177. }
  178.  
  179. const polinom mult(const polinom& arg, const double d, const int t){
  180.     int i;
  181.     polinom p;
  182.     p.n+=arg.n+t;
  183.     for(i=0;i<=arg.n;i++)
  184.         p.data[i+t]=arg.data[i]*d;
  185.     return p;
  186. }
  187.  
  188. void div(polinom& res, polinom& tmp, const polinom& right){
  189.     int t;
  190.     double d;
  191.     while(tmp.n>=right.n){
  192.         d=tmp.data[tmp.n]/right.data[right.n];
  193.         t=tmp.n-right.n;
  194.         res.data[t]=d;
  195.         if(t>res.n) res.n=t;
  196.         tmp=tmp-mult(right,d,t);
  197.         tmp.n--;
  198.     }
  199. }
  200.  
  201. const polinom operator * (const polinom& arg, const double d){
  202.     int i;
  203.     polinom p;
  204.     for(i=0;i<=arg.n;i++)
  205.         p.data[i]=arg.data[i]*d;
  206.     return p;
  207. }
  208.  
  209. const polinom operator / (const polinom& arg, const double d){
  210.     if(d==0){
  211.         throw invalid_argument("dividing by zero");
  212.         exit(0);
  213.     }
  214.     int i;
  215.     polinom p;
  216.     for(i=0;i<=arg.n;i++)
  217.         p.data[i]=arg.data[i]/d;
  218.     return p;
  219. }
  220.  
  221. const polinom operator / (const polinom& left, const polinom& right){
  222.     polinom res,tmp=left;
  223.     if(right.n==0 && right.data[0]==0){
  224.         throw invalid_argument("dividing by zero");
  225.         exit(0);
  226.     }
  227.     div(res,tmp,right);
  228.     return res;
  229. }
  230.  
  231. const polinom operator % (const polinom& left, const polinom& right){
  232.     polinom res,tmp=left;
  233.    
  234.     div(res,tmp,right);
  235.     return tmp;
  236. }
  237.  
  238. const polinom operator * (const polinom& left, const polinom& right){
  239.     polinom res;
  240.     res.n=left.n+right.n;
  241.     for(int i=0;i<=left.n;i++)
  242.         res=res+mult(right,left.data[i],i);
  243.     return res;
  244. }
  245.  
  246. const polinom operator - (const polinom& left, const polinom& right){
  247.     int i=0;
  248.     polinom p=left;
  249.     p.n=maxof(left.n,right.n);
  250.     for(i=0;i<=p.n;i++)
  251.         p.data[i]=left.data[i]-right.data[i];
  252.     return p;
  253. }
  254.  
  255. const polinom operator + (const polinom& left, const polinom& right){
  256.     int i=0;
  257.     polinom p=left;
  258.     p.n=maxof(left.n,right.n);
  259.     for(i=0;i<=p.n;i++)
  260.         p.data[i]=left.data[i]+right.data[i];
  261.     return p;
  262. }
  263.  
  264. const polinom& polinom::operator = (const polinom& arg){
  265.     for(int i=0;i<=n;i++)
  266.         data[i]=0;
  267.     n=arg.n;
  268.     for(int i=0;i<=n;i++)
  269.         data[i]=arg.data[i];
  270.     return *this;
  271. }
  272.  
  273. bool operator == (const polinom& left, const polinom& right){
  274.     if(left.n!=right.n) return false;
  275.    
  276.     for(int i=0;i<=left.n;i++)
  277.         if(left.data[i]!=right.data[i])
  278.             return false;
  279.     return true;
  280. }
  281.  
  282. bool operator != (const polinom& left, const polinom& right){
  283.     return !(left==right);
  284. }
  285.  
  286. void polinom::write() const{
  287.     for(int i=n;i>=0;i--){
  288.         if(data[i]>=0) cout << "+";
  289.         if(data[i]<0) cout << "-";
  290.         cout << setw(3) << fabs(data[i]);
  291.         cout << "*x";
  292.         cout << "^" <<  setw(2) << i << " ";
  293.     }
  294. }
  295.  
  296. void polinom::fwrite(ofstream& out) const{
  297.     for(int i=n;i>=0;i--){
  298.         if(data[i]>=0) out << "+";
  299.         if(data[i]<0) out << "-";
  300.         out << setw(3) << fabs(data[i]);
  301.         out << "*x";
  302.         out << "^" <<  setw(2) << i << " ";
  303.     }
  304. }
  305.  
  306. void polinom::fread(fstream& in){
  307.     string s;
  308.    
  309.     n=0;
  310.     for(int i=0;i<Size;i++)
  311.         data[i]=0;
  312.     in >> s;
  313.     parse(s);
  314. }
  315.  
  316. void polinom::read(){
  317.     string s;
  318.    
  319.     n=0;
  320.     for(int i=0;i<Size;i++)
  321.         data[i]=0;
  322.     cin >> s;
  323.     parse(s);
  324. }
  325.  
  326. void fprint_div(ofstream& out, const polinom& left, const polinom& right){
  327.     polinom tmod=left,tdiv,r=left,q,tmp;
  328.     double d;
  329.     int t,i,n=1;
  330.     string tab="          ",line="----------";//length depends of setw() argument in fwrite() function
  331.    
  332.     left.fwrite(out);
  333.     out << " | ";
  334.     right.fwrite(out);
  335.     out << endl;
  336.     div(q,r,right);
  337.     if(tmod.n>=right.n){
  338.         d=tmod.data[tmod.n]/right.data[right.n];
  339.         t=tmod.n-right.n;
  340.         tmp=mult(right,d,t);
  341.         tmp.fwrite(out);
  342.         tmod=tmod-tmp;
  343.         tmod.n--;
  344.         out << " |";
  345.         for(i=0;i<=maxof(right.n,q.n);i++) out << line;
  346.         out << endl;
  347.         for(i=0;i<=left.n;i++) out << line;
  348.         out << " | ";
  349.         q.fwrite(out);
  350.         out << endl;
  351.         out << tab;
  352.         tmod.fwrite(out);
  353.         out << endl;
  354.     }
  355.     else{
  356.         for(i=0;i<left.n;i++) out << tab;
  357.         out << "      0  |";
  358.         for(i=0;i<=maxof(right.n,q.n);i++) out << line;
  359.         out << endl;
  360.         for(i=0;i<=left.n;i++) out << line;
  361.         out << " | 0" << endl;
  362.         left.fwrite(out);
  363.     }
  364.     while(tmod.n>=right.n || tmod.n==-1){
  365.         d=tmod.data[tmod.n]/right.data[right.n];
  366.         t=tmod.n-right.n;
  367.         tmp=mult(right,d,t);
  368.         for(i=0;i<n;i++) out << tab;
  369.         tmp.fwrite(out);
  370.         out << endl;
  371.         if(tmod.n==-1){
  372.             out << endl << endl;
  373.             out << "div=";
  374.             q.fwrite(out);
  375.             out << endl;
  376.             out << "mod=";
  377.             r.fwrite(out);
  378.             out << endl;
  379.             return;
  380.         }
  381.         for(i=0;i<n;i++) out << tab;
  382.         for(i=0;i<=tmod.n;i++) out << line;
  383.         n++;
  384.         tmod=tmod-tmp;
  385.         tmod.n--;
  386.         while(tmod.n>=0 && tmod.data[tmod.n]==0)
  387.             tmod.n--,n++;
  388.         if(tmod.n==-1){
  389.             tmod.n=0;
  390.             out << endl;
  391.             for(i=0;i<n-1;i++) out << tab;
  392.             tmod.fwrite(out);
  393.             out << endl;
  394.             tmod.n=-1;
  395.         }
  396.         else{
  397.             out << endl;
  398.             for(i=0;i<n;i++) out << tab;
  399.             tmod.fwrite(out);
  400.             out << endl;
  401.         }
  402.     }
  403.     out << endl << endl;
  404.     out << "div=";
  405.     q.fwrite(out);
  406.     out << endl;
  407.     out << "mod=";
  408.     r.fwrite(out);
  409.     out << endl;
  410. }
  411.  
  412. int main (int argc, char *argv[]){
  413.     //fstream in("in.txt");
  414.     ofstream fout("out.txt");
  415.     polinom a("3*x^5+4*x^4-x^2+2*x-1"),b("x^2-3*x+2"),c;
  416.     //a.fread(in);
  417.     //b.fread(in);
  418.     fprint_div(fout,a,b);
  419.     fout.close();
  420.     return 0;
  421. }
  422.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement