pku ACM 1001

今天花了比较长的时间编写这个程序,感觉编程的速度还是不够快,不过收获也比较大,在POJ上通过了,很开心微笑,这个还是属于大整数计算问题(大整数乘法)。

#include <iostream>

#include <string.h>
#include <fstream>
#define M 260

using namespace std;


void MaxIntegerMul(int *a,int *b,int *c)
{//c=a*b  a,b,c是M位整数(整数数组)
    
    int m=M-1;
    for(int i=M-1;i>=M/2;i--)
    {
        if(b[i]==0) {m--;continue;}
        int n=m;
        int jinwei=0;
        for(int j=M-1;j>=M/2;j--)
        {
            int x=c[n]+a[j]*b[i]+jinwei;
            c[n]=x%10;
            jinwei=x/10;
            n--;
        }
        m--;   
    }     
}

void LargeIntegerExp(int *a,int n,int *b)
{
    
    int c[4][M];
    memset(c,0,sizeof(int)*M*4);
   
    if(n==1) { for(int i=0;i<M;i++) b[i]=a[i]; return ;}
    MaxIntegerMul(a,a,c[0]);
    if(n==2) { for(int i=0;i<M;i++) b[i]=c[0][i]; return ;}
    if(n==3) { MaxIntegerMul(a,c[0],b); return ;}
    MaxIntegerMul(c[0],c[0],c[1]);
    if(n==4) { for(int i=0;i<M;i++) b[i]=c[1][i]; return ;}
    if(n==5) { MaxIntegerMul(a,c[1],b); return ;}
    if(n==6) { MaxIntegerMul(c[0],c[1],b); return ;}
    if(n==7) {
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[1],c[0],d);
        MaxIntegerMul(a,d,b);
        return ;
    }
    MaxIntegerMul(c[1],c[1],c[2]);
    if(n==8) { for(int i=0;i<M;i++) b[i]=c[2][i]; return ;}
    if(n==9) { MaxIntegerMul(a,c[2],b); return ;}
    if(n==10) { MaxIntegerMul(c[0],c[2],b); return ;}
    if(n==11) {
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[2],c[0],d);
        MaxIntegerMul(a,d,b);
        return ;
    }
    if(n==12){MaxIntegerMul(c[2],c[1],b); return;}
    if(n==13) {
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[2],c[1],d);
        MaxIntegerMul(a,d,b);
        return ;
    }
    if(n==14){
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[2],c[1],d);
        MaxIntegerMul(c[0],d,b);
        return ;
    }
    if(n==15){
        int d[M]; memset(d,0,sizeof(int)*M);
        int e[M]; memset(e,0,sizeof(int)*M);
        MaxIntegerMul(c[2],c[1],d);
        MaxIntegerMul(c[0],a,e);
        MaxIntegerMul(d,e,b);
        return ;
    }
    MaxIntegerMul(c[2],c[2],c[3]);
    if(n==16) { for(int i=0;i<M;i++) b[i]=c[3][i]; return ;}
    if(n==17) { MaxIntegerMul(a,c[3],b); return ;}
    if(n==18) { MaxIntegerMul(c[3],c[0],b); return ;}
    if(n==19) {
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[3],c[0],d);
        MaxIntegerMul(a,d,b);
        return ;
    }
    if(n==20) { MaxIntegerMul(c[3],c[1],b); return ;}
    if(n==21) {
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[3],c[1],d);
        MaxIntegerMul(a,d,b);
        return ;
    }   
    if(n==22){
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[3],c[1],d);
        MaxIntegerMul(c[0],d,b);
        return ;
    }
    if(n==23){
        int d[M]; memset(d,0,sizeof(int)*M);
        int e[M]; memset(e,0,sizeof(int)*M);
        MaxIntegerMul(c[3],c[1],d);
        MaxIntegerMul(c[0],a,e);
        MaxIntegerMul(d,e,b);
        return ;
    }
    if(n==24){   MaxIntegerMul(c[3],c[2],b); return ;}
    if(n==25){
        int d[M]; memset(d,0,sizeof(int)*M);
        MaxIntegerMul(c[3],c[2],d);
        MaxIntegerMul(a,d,b);
        return ;
    }    
}    

int main()
{
    //ifstream cin("2.txt");
    int a[M]={0},b[M]={0};
 
    char aa[10];
    char resu[M];  //把大整数转换成字符串(计算结果)
    int n;
    while(cin>>aa>>n)
    {
        memset(a,0,sizeof(int)*M);
        memset(b,0,sizeof(int)*M);
        int len=strlen(aa);
        int k=M-1;
        int s=0;  //记录小数点后有几位
        bool flag=true;
        for(int i=len-1;i>=0;i--)
        {//把实数R去掉小数点当成整数存入a数组中            
            if(aa[i]!='.')
              a[k--]=aa[i]-'0';
            else flag=false;
            
            if(flag) s++;
        }  
          
        LargeIntegerExp(a,n,b);//计算a的n次方,结果存入b数组
        
        int i;
        for( i=0;i<M;i++)
        if(b[i]) break;
        int p=0;   
        for(int k=i;k<=M-1-s*n;k++)
           resu[p++]=b[k]+'0';
         
        resu[p++]='.';
        for(int k=M-1-s*n+1;k<=M-1;k++)
           resu[p++]=b[k]+'0';
        resu[p]='\0';
        len=strlen(resu);
        for(int i=len-1;i>=0;i--)  //去掉小数点后面多余的0
        {
           if(resu[i]=='0') resu[i]='\0';
           else if (resu[i]=='.') { resu[i]='\0'; break;}
           else break;   
        }
        if(strlen(resu)==0) cout<<0<<endl;
        cout<<resu<<endl;        
    }
    //system("pause");   
    return 0;
}       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值