首页
社区
课程
招聘
[旧帖] [求助]c++高手帮忙优化算法 0.00雪花
发表于: 2011-8-31 22:03 1258

[旧帖] [求助]c++高手帮忙优化算法 0.00雪花

2011-8-31 22:03
1258
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int min(int,int);

class INT
{
       
public:
//        INT(int n);
        INT(string);
        void print(INT i);
        string add(INT b);
        string minus(INT b);
        INT cheng(INT a);
        friend int change(INT& a,INT& b);
        friend int cifang(int i);
        INT& operator+(INT);
        INT& operator-(INT);
        INT& operator*(INT);
        INT& operator/ (INT &b);
        //INT& operator = (INT &b);
        bool operator <(INT &b);
       
private:
        unsigned short*ptr;
        int size;
        bool is;
};
INT& pre (INT& a);

INT& INT::operator +(INT a)
{
        return *(new INT(this->add(a)));
}

INT& INT::operator -(INT a)
{
        return *(new INT(this->minus(a)));
}
INT& INT::operator *(INT a)
{
        return*(new INT(this->cheng(a)));
}

/*inline INT::INT(int n)
{
        if(n<0)
        {
                n=-n;is=true;
        }
        size=3;
        ptr=new unsigned short[size];
        ptr[0]=n%10000;
        ptr[1]=n/10000%10000;
        ptr[2]=n/100000000;

}*/
inline INT::INT(string str)
{
        int len;
        int i,j;

        if(str[0]=='-')
        {
                is=true;
                str.erase(str.begin(),str.begin()+1);
        }
        else is=false;
        len=str.size();
        size=ceil(len/4.0);
        ptr=new unsigned short[size];
    for(i=0;i<size;++i)
        {
                int x=0; int y=1;
                for(j=0;j<4;j++)
                {
                        if(len-1-i*4-j>=0)
                        x+=y*(str[len-1-i*4-j]-'0');
                        else break;
                        y*=10;
                }
                ptr[i]=x;
               
        }

/*        if(is)
        {
       for(i=0;i<size&&ptr[i]==0;++i);
           if(i==size) is=false;
        }*/
}

void INT::print(INT a)
{
        int i;
        if(is)
        {
                cout<<"-";
            is=false;
        }
        for(i=a.size-1;i>=0;i--)
        {
                if(a.ptr[i]<1000&&i!=a.size-1)
                {
                        if(a.ptr[i]<10)
                                cout<<"000"<<a.ptr[i];
                        else if(a.ptr[i]<100)
                                cout<<"00"<<a.ptr[i];
                        else
                                cout<<"0"<<a.ptr[i];
                       
                }
         else       
                 cout<<a.ptr[i];
        }
        cout<<endl;
}

string INT::add(INT b)
{
        INT a=*this;
        string resultstr="";
        string resultstr2="";
        string resultstr3="";
        char str[4];
        int jin=0;
        int sum;
        for(int k=0;k<min(a.size,b.size);k++)
        {

        sum=a.ptr[k]+b.ptr[k]+jin;
        if(sum>10000)
        {
             jin=1;
                 sum=sum-10000;
        }
        else
        {
                jin=0;
        }
        str[3]=sum%10+'0';
        str[2]=(sum%100-sum%10)/10+'0';
        str[1]=sum%1000/100+'0';
        str[0]=sum/1000+'0';
        for(int i=3;i>=0;i--)
        resultstr=str[i]+resultstr;

        }
       
        //判断a,b在size大小
        if(a.size>b.size)
        {
                for(k=b.size;k<a.size;k++)
                {
                        a.ptr[k]=a.ptr[k]+jin;
                        if(a.ptr[k]>10000)
                        {
                                jin=1;
                                a.ptr[k]-=10000;
                        }
                        else
                        {
                                jin=0;
                        }
                        str[3]=a.ptr[k]%10+'0';
                str[2]=(a.ptr[k]%100-a.ptr[k]%10)/10+'0';
                str[1]=a.ptr[k]%1000/100+'0';
                str[0]=a.ptr[k]/1000+'0';
                        for(int i=3;i>=0;i--)
                        resultstr2=str[i]+resultstr2;
                }
                resultstr=resultstr2+resultstr;
                if(jin==1)
               resultstr="1"+resultstr;
                return resultstr;
        }
        else if(a.size==b.size)
        {
                if(jin==1)
                        resultstr="1"+resultstr;
                return resultstr;
        }
        else
        {
         for(k=a.size;k<b.size;k++)
                {
                        b.ptr[k]=b.ptr[k]+jin;
                        if(b.ptr[k]>10000)
                        {
                                jin=1;
                                sum-=10000;
                        }
                        else
                        {
                                jin=0;
                        }
                        str[3]=b.ptr[k]%10+'0';
                str[2]=(b.ptr[k]%100-b.ptr[k]%10)/10+'0';
                str[1]=b.ptr[k]%1000/100+'0';
                str[0]=b.ptr[k]/1000+'0';
                        for(int i=3;i>=0;i--)
                        resultstr3=str[i]+resultstr3;
                }
                resultstr=resultstr3+resultstr;
                if(jin==1)
               resultstr="1"+resultstr;
                return resultstr;
        }
//        char* x=resultstr.assign();
        return resultstr;
}

string INT::minus(INT b)
{
    INT a=*this;
        string resultstr="";
        string resultstr2="";
        string resultstr3="";
        char str[4];
        int jie=0;
        int res;
        int pos=0;
        if(a.size<b.size)
        {
                pos=change(a,b);
        }
        if(a.size>b.size)
        {
        for(int k=0;k<min(a.size,b.size);k++)
        {

        res=a.ptr[k]-b.ptr[k]-jie;
        if(res<0)
        {
               
             jie=1;
             res=10000+res;
        }
        else
        {
                jie=0;
        }
        str[3]=res%10+'0';
        str[2]=(res%100-res%10)/10+'0';
        str[1]=res%1000/100+'0';
        str[0]=res/1000+'0';
        for(int i=3;i>=0;i--)
        resultstr=str[i]+resultstr;
        }
       

       
                for(k=b.size;k<a.size;k++)
                {
                        a.ptr[k]=a.ptr[k]-jie;
                        jie=0;
                        str[3]=a.ptr[k]%10+'0';
                str[2]=(a.ptr[k]%100-a.ptr[k]%10)/10+'0';
                str[1]=a.ptr[k]%1000/100+'0';
                str[0]=a.ptr[k]/1000+'0';
                        for(int i=3;i>=0;i--)
                        resultstr2=str[i]+resultstr2;
                }
                resultstr=resultstr2+resultstr;
                if(pos) resultstr="-"+resultstr;
                return resultstr;
        }
         if(a.size==b.size)
        {
                 if(a.ptr[a.size-1]<b.ptr[a.size-1])
                 {
                         pos=change(a,b);
                 }
                for(int k=0;k<a.size;k++)
        {

        res=a.ptr[k]-b.ptr[k]-jie;
        if(res<0)
        {
             jie=1;
             res=10000+res;
        }
        else
        {
                jie=0;
        }
        str[3]=res%10+'0';
        str[2]=(res%100-res%10)/10+'0';
        str[1]=res%1000/100+'0';
        str[0]=res/1000+'0';
        for(int i=3;i>=0;i--)
        resultstr=str[i]+resultstr;
                }
                if(pos) resultstr="-"+resultstr;
                        return resultstr;
         }

}
int min(int x,int y)
{
        return x<y?x:y;
}

int change(INT& a,INT& b)
{
        INT temp("");
        temp=a;
        a=b;
        b=temp;
        return 1;
}

INT INT::cheng(INT a)
{
        /*INT b=*this;
        int m=0;
        int n=0;
        int sum=0;
        int sum1=0;
        int sum2=0;
        string resultstr="";
        for(int i=0;i<a.size;i++)
        {
                m=cifang(i);
                sum=sum+a.ptr[i]*m;
        }
        for(int k=0;k<b.size;k++)
        {
                n=cifang(k);
                sum1=sum1+b.ptr[k]*(n);
        }
        sum2=sum*sum1;
       
       
        char str;
        int sum3=0;
        int len=0;
        for(int s=sum2;s>10;s=s/10)
        {
                len++;
        }
        len=len+1;
        for(i=1;i<=len;i++)
        {
            if(0<=sum2<10)
                {str=sum2+'0';}
                else
                {
                        sum3=sum2%10;
                        sum2=sum2/10;
                        str=sum3+'0';
                }
               
                resultstr=str+resultstr;

        }
        return resultstr;*/

        INT b=*this;
        INT m("");
        int sum=0;
        int n=0;
        for(INT i("0");i<b;pre(i))
        {
                m=INT(m+a);
        }
        return m;
       

}
INT & pre (INT & a)
{
        INT b("1");
        a=INT(a+b);
        return a;
}

bool INT::operator < (INT &b)
{
        INT a=*this;
        if(a.size>b.size)
        {
                return 0;
        }
        if(a.size==b.size)
        {
                INT c(a-b);
                return c.is;
        }
        else
        {
                return 1;
        }
}

/*INT& INT::operator = (INT &b)
{
        INT a=*this;
        a.size=b.size;
        for(int i=0;i<b.size;i++)
        {
                a.ptr[i]=b.ptr[i];

        }
        return a;

}*/
INT& INT::operator / (INT &b)
{
        INT a=*this;
        INT n("1");
        for(INT i("0");i<a;pre(i))
        {
                if((i*b)<a)
                {
               
                }
                else
                {
                       
                        return i=i-n;
                }
        }
       
}

int main()
{
        INT a("10000");
        INT b("999999999999999999");
        a.print(a);
        b.print(b);
        INT c("");
        c=a*b;
        c.print(c);

   
       
        return 0;
}

//主要优化乘法的算法

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
直接上GMP吧,优化意义不大。。
非要优化的话,第一步就是放弃10000进制,改成2^32。
2011-9-1 04:11
0
游客
登录 | 注册 方可回帖
返回
//