UVA 485、424、495、324 大整数

题目:

分析:大整数的乘法与加法 推荐算法分析 ”程序员小灰“微信平台 文章。(关注他微信公众号后,点击右上角「…」,再点击「全部消息」,搜索「大整数」,完成)

说明:定定定 c++编写了一个大整数类来解决这些题。当然,大整数类 并不完善,日后继续学习时,找机会完善。

大整数代码

#include <iostream>
#include "cstring"
#include <string>
#include <stdlib.h>
#define N 1000
 
using namespace std;
class bigInteger
{
private:
    int *arrayInt;//倒序数组
    unsigned int len;
public:
    bigInteger(const string bigNum)
    {
        len=bigNum.length();
        arrayInt=new int[len];
        for(unsigned int i=0; i<bigNum.length(); i++)
        {
            arrayInt[i]=bigNum[bigNum.length()-1-i]-'0';   //倒序赋值
        }
    }
    bigInteger(int bigNUM_len)//单独给result的构造函数
    {
        len=bigNUM_len;
        arrayInt=new int[len+1]();
    }
    bigInteger()
    {
        arrayInt=NULL;
        len=0;
    }
    ~bigInteger()
    {
        if(arrayInt!=NULL)
        {
            delete []arrayInt;
            arrayInt=NULL;
            len=0;
        }
    }
 
    /* 测试代码
    void show()
     {
         for(unsigned int i=0;i<len;i++)
         {
             cout<<arrayInt[i];
         }
         cout<<endl;
         cout<<len;
     }*/
 
    bigInteger(const bigInteger &A)
    {
        this->len=A.len;
        if(len!=0)
        {
            this->arrayInt=new int[len];
            for(unsigned int i=0; i<len; i++)
            {
                (this->arrayInt)[i]=(A.arrayInt)[i];
            }
        }
    }
 
 
    bigInteger& operator=(const bigInteger & A)
    {
        this->len=A.len;
        if(len!=0)
        {
            this->arrayInt=new int[len];
            for(unsigned int i=0; i<len; i++)
            {
                (this->arrayInt)[i]=(A.arrayInt)[i];
            }
        }
        return *this;
    }
 
 
    void operator += (const bigInteger &A)
    {
        if(A.arrayInt!=NULL && this->arrayInt!=NULL)
        {
            unsigned int maxlength=max(this->len,A.len);
            unsigned int minlength=min(this->len,A.len);
            bigInteger result(maxlength);
            result.arrayInt[0]=0;
 			//做加法
            for(unsigned int i=0; i<maxlength; i++)
            {
                int temp;
                if(i<minlength)
                    temp=this->arrayInt[i]+A.arrayInt[i]+result.arrayInt[i];
                else
                {
                    if(A.len==minlength)
                        temp=this->arrayInt[i]+result.arrayInt[i];
                    else if(this->len==minlength)
                        temp=A.arrayInt[i]+result.arrayInt[i];
                }
                result.arrayInt[i]=temp%10;
                result.arrayInt[i+1]=temp/10;
            }
 //程序健壮性
            if(result.arrayInt[maxlength]!=0)
            {
                result.len++;
            }
            else {}//else时,不改变result.len
 
            *this=result;
        }
        else if(A.arrayInt!=NULL && this->arrayInt==NULL)
        {
            *this=A;
        }
    }
    
    friend istream & operator >>(istream & in,bigInteger &A);
    friend ostream & operator <<(ostream & out,const bigInteger &A);
    friend bigInteger operator+(const bigInteger A,const bigInteger B);
    friend bigInteger operator*(const bigInteger A,const bigInteger B);
 
    //适配题目的函数
    int *getarrayInt()
    {
        return arrayInt;
    }
    int getLen()
    {
        return len;
    }
 
};
 
istream & operator >>(istream & in,bigInteger &A)
{
    string s;
    in>>s;
    A=bigInteger(s);//为什么这样不行???过了,应该是当时,没重载<<
   /* if(A.arrayInt!=NULL)
    {
        delete []A.arrayInt;
    }
    A.len=s.length();
    A.arrayInt=new int[A.len];
    for(unsigned int i=0; i<s.length(); i++)
    {
        (A.arrayInt[i])=s[s.length()-1-i]-'0';   //倒序赋值
    }*/

    return in;
}
 
ostream & operator <<( ostream & out,const bigInteger &A)//  cout<<(A+B);
 
{
    for(unsigned int i=0; i<A.len; i++)
        out<<A.arrayInt[A.len-1-i];
    return out;
}
 
bigInteger operator+(const bigInteger A,const bigInteger B)
{
    if(A.arrayInt!=NULL && B.arrayInt!=NULL)
    {
        unsigned int maxlength=max(B.len,A.len);
        unsigned int minlength=min(B.len,A.len);
        bigInteger result(maxlength);
        result.arrayInt[0]=0;
 
        for(unsigned int i=0; i<maxlength; i++)
        {
            int temp;
            if(i<minlength)
                temp=B.arrayInt[i]+A.arrayInt[i]+result.arrayInt[i];
            else
            {
                if(B.len==minlength)
                    temp=A.arrayInt[i]+result.arrayInt[i];
                else if(A.len==minlength)
                    temp=B.arrayInt[i]+result.arrayInt[i];
            }
            result.arrayInt[i]=temp%10;
            result.arrayInt[i+1]=temp/10;
        }
 
        if(result.arrayInt[maxlength]!=0)
        {
            result.len++;
        }
        else {}//else时,不改变result.len
 
        return result;
    }
    else
    {
        if(A.arrayInt!=NULL)
            return A;
        else if(B.arrayInt!=NULL)
            return B;
        else if(A.arrayInt==NULL &&B.arrayInt==NULL)
            return A;
    }
}
 
bigInteger operator*(const bigInteger A,const bigInteger B)
{
    if(A.arrayInt!=NULL && B.arrayInt!=NULL)
    {
        bigInteger result(A.len+B.len) ;
        result.arrayInt[0]=0;
        for(unsigned int i=0; i<B.len; i++)
        {
            for(unsigned int j=0; j<A.len; j++)
            {
                result.arrayInt[i+j]+=A.arrayInt[j]*B.arrayInt[i];
                if(result.arrayInt[i+j]>=10)
                {
                    result.arrayInt[i+j+1]+=result.arrayInt[i+j]/10;
                    result.arrayInt[i+j]=result.arrayInt[i+j]%10;
                }
            }
        }
            //确定result.len
            int counter=0;
            for(unsigned int i=result.len-1; i>=(max(A.len,B.len)-1); i--)
            {
 
                if(result.arrayInt[i]==0)
                {
 
                    counter++;
                }
                else
                    break;
            }
            result.len-=counter;
 
        return result;
    }
    else
    {
        if(A.arrayInt!=NULL)
            return A;
        else if(B.arrayInt!=NULL)
            return B;
        else if(A.arrayInt==NULL &&B.arrayInt==NULL)
            return A;
    }
}

UVA 485 Pascal’s Triangle of Death(主函数部分)
杨辉三角 (注意 把数组a写到全局变量,否则可能会Runtimely Error)

bigInteger a[1500],init("1");
int main()
{
 
    int k=1;
    bool flag=true;
    a[0]=init;
    while(flag)
    {
        bigInteger p,q("0");
        if(k!=1) a[k-1]=q;
        for(int i=0;i<k;++i)
        {
            p=a[i];
            a[i]=p+q;
            if(a[i].getLen()>=61) {flag=false;}//当位数为61时,那一行也要输出
            q=p;
        }
            for(int i=0;i<k;++i)
            {
                if(i!=0) cout<<' ';
                cout<<a[i];
            }
            cout<<endl;
            k++;
    }
    return 0;
}

UVA 424 Integer Inquiry
整数加法

int main()
{
    bigInteger a,b;
    while(1)
    {
        cin>>b;
        if(b.getarrayInt()[0]==0&&b.getLen()==1)
        break;
        else
        {
            a+=b;
        }
    }
    cout<<a<<endl;
    return 0;
}

UVA 495 Fibonacci Freeze
斐波那契数列 (注意第一项从0开始)

bigInteger a[5003]={bigInteger("0"),bigInteger("1"),bigInteger("1")};
int main()
{
    for(int j=3;j<=5000;++j)
    {
        a[j]=a[j-1]+a[j-2];
    }
     int i;
    while(scanf("%d",&i) != EOF)
    {
        cout<<"The Fibonacci number for "<<i<<" is "<<a[i]<<endl;
    }
    return 0;
}

UVA 324 Factorial Frequencies
阶乘

bigInteger a[366]= {bigInteger("1")};
int main()
{
    for(int i=1; i<366; i++)
    {
        stringstream ss;
        string s;
        ss<<i+1;
        ss>>s;
        bigInteger num(s);
        a[i]=a[i-1]*s;
    }
    int k;
    while(cin>>k&&k!=0)
    {
        int record_count[10]= {0};
        for(int i=0; i<a[k-1].getLen(); ++i)
        {
            int number;
            number=(a[k-1].getarrayInt())[i];
            switch(number)
            {
            case 0:
                record_count[0]++;
                break;
            case 1:
                record_count[1]++;
                break;
            case 2:
                record_count[2]++;
                break;
            case 3:
                record_count[3]++;
                break;
            case 4:
                record_count[4]++;
                break;
            case 5:
                record_count[5]++;
                break;
            case 6:
                record_count[6]++;
                break;
            case 7:
                record_count[7]++;
                break;
            case 8:
                record_count[8]++;
                break;
            case 9:
                record_count[9]++;
                break;
            }
        }
        //输出
        printf("%d! --\n",k);
        printf("(0) %d (1) %d (2) %d (3) %d (4) %d\n",record_count[0],record_count[1],record_count[2],
               record_count[3],record_count[4]);
        printf("(5) %d (6) %d (7) %d (8) %d (9) %d\n",record_count[5],record_count[6],record_count[7],
               record_count[8],record_count[9]);
    }
    return 0;
}

查题网站:https://vjudge.net/

分析大整数乘法:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意1:如果您要使用ADN建视频站,请保留官方站的友链链接 注意2:如果您要采集数据资源,请到官方论坛登记获取注册码 ADN视频收藏专家ACC版安装说明(为了保证你的数据库安全,请修改数据库名称或路径) 类型A:直接安装在根目录下 1:将ADN完整安装包下载解压后直接上传至根目录即可! 类型B:安装在二级目录下 1:将ADN完整安装包下载解压后打开Cache/AdnCms.Config.asp! 2:找到第1行在Config(0)的值前面加上二级目录名称! 如:我的二级目录Config(0)='/Movie/' 3:找到第5行在Config(2)的值前面加上二级目录名称!  如:我的二级目录Config(2)='/Movie/Data/AdnCms.mdb' 4:将修改后的完整安装包直接上传至二级目录即可! ADN视频收藏专家SQL版安装说明 1:将ADN完整安装包下载解压后打开Cache/AdnCms.Config.asp! 2:修改第6-9的参数信息为您的SQL帐号信息!  Config(3)='data'数据库名称  Config(4)='admin'SQL帐号名称  Config(5)='admin888'SQL帐号密码  Config(6)='(local)'服务器IP 3:将修改后的完整安装包直接上传至任意目录 4:通过'企业管理器'执行Data目录下的SQL语句,并导入数据库的文件即可 ADN视频收藏专家模拟静态页面配置说明(必须安装在根目录才可使用) 1:需安装ISAPI_Rewrite组件,请自行到网上搜索此软件并安装于您的服务器。   2:配置httpd.ini文件,在该文件尾部加入以下代码: #重写index.asp RewriteRule/index.html/index.asp[N,I] #重写List.asp RewriteRule/List_(d+).html/List.asp?ClassId=$1[N,I] RewriteRule/List_(d+)_(d+).html/List.asp?ClassId=$1&page=$2[N,I] #重写Data.asp RewriteRule/Data_(d+).html/Data.asp?DataId=$1[N,I] 加入了百度影音播放器 20111124: 修正了上传服务器错误500

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值