poj 1001

点击打开链接 大数乘法,看过一遍别人的再写出来,用的是模仿乘法笔算的方法

WA 了N遍,发现手残点去了别的题目。我。。。

#include<iostream>  
#include <string>   
#include<vector>  
#include<algorithm>  
#include<set>  
#include<fstream>
#include<cmath>  
using namespace std;  
#define lch(i) ((i)<<1)  
#define rch(i) ((i)<<1|1)  
#define sqr(i) ((i)*(i))  
#define pii pair<int,int>  
#define mp make_pair  
#define FOR(i,b,e) for(int i=b;i<=e;i++)  
#define ms(a)   memset(a,0,sizeof(a))  
const int maxnum = 100005;  
const int inf = 100005;


int  res[maxnum],a[maxnum],b[maxnum];
int  anslen,alen,blen;

void bigmul(){  
    int i, j;  
    memset(res, 0, sizeof(res));  
    for (i=1; i<=alen; i++)  
    {  
        for (j=1; j<=blen; j++)  
        {  
            res[i+j-1] += a[i] * b[j];  
            if (res[i+j-1]>9)   
            {  
                res[i+j] += res[i+j-1] / 10;  
                res[i+j-1] %= 10;  
            }  
        }  
    }  
    if (res[alen+blen-1]>9)   
    {  
        res[alen+blen] += res[alen+blen-1] / 10;  
        res[alen+blen-1] %= 10;  
    }  
    alen = alen + blen;  
    for (i=1; i<=alen; i++) a[i] = res[i];  
}


int main()  
{  
	/*ifstream fin("G:/1.txt");*/
	int n;char r[7];int dot;
	while(scanf("%s %d",r,&n)!=EOF){
		dot = -1;
		alen = blen = 0;
		for(int i=5;i>=0;i--){
			if(r[i]=='.'){
				dot = i;
			}
			else
				a[++alen]=b[++blen]=r[i]-'0';
		}
		FOR(i,1,n-1){
			bigmul();
		}
		dot = 5-dot;
		dot *= n;
		int up = alen;
		while(a[up]==0)
			up--;
		int j=1;
		 for (j=1; j<=alen; j++)  
            {  
                if (a[j]!=0)   break;  
                            }  
		if(dot>up) up = dot;
		if (j>dot) j = dot + 1;  
		for(;up>=j;up--){
			if(up==dot) printf(".");
			printf("%d",a[up]);
		}
		printf("\n");
	}
	return 0;
}

接下来贴一个二分高精度的代码,结果正确,但是应该是二分得太细了,没有起到加速的作用反而更慢了,以后再优化

#include<iostream>  
#include <string>   
#include<vector>  
#include<algorithm>  
#include<set>  
#include<fstream>
#include<cmath>  
using namespace std;  
#define lch(i) ((i)<<1)  
#define rch(i) ((i)<<1|1)  
#define sqr(i) ((i)*(i))  
#define pii pair<int,int>  
#define mp make_pair  
#define FOR(i,b,e) for(int i=b;i<=e;i++)  
#define ms(a)   memset(a,0,sizeof(a))  
const int maxnum = 1005;  
const int inf = 100005;


struct big
{
	int size,bit[maxnum];
	big(){size=0;ms(bit);}
	big(const big& a){
		size=a.size;
		ms(bit);
		memcpy(bit,a.bit,sizeof(a.bit));
	}
};

big operator+(const big& a,const big& b){
	big mom;
	if(b.size<a.size) return b+a;
	
	for(int i=1;i<=a.size;i++){
		mom.bit[i]+=a.bit[i]+b.bit[i];
		if(mom.bit[i]>9){
			mom.bit[i+1]+=mom.bit[i]/10;
			mom.bit[i] %= 10;
		}
	}
	for(int i=a.size+1;i<=b.size;i++){
		mom.bit[i]+=b.bit[i];
		if(mom.bit[i]>9){
			mom.bit[i+1]+=mom.bit[i]/10;
			mom.bit[i] %= 10;
		}
	}
	mom.size=b.size;
	if(mom.bit[b.size+1])
		mom.size++;
	return mom;


}

big pow10(const big& a,int n){
	big b;
	for(int i=a.size+n;i>n;i--)b.bit[i]=a.bit[i-n];
	for(int i=0;i<=n;i++)b.bit[i]=0;
	b.size = a.size+n;
	return b;
}



big operator*(const big&a,const big& b){
	big mom,a0,a1,b0,b1;
	if(a.size==0||b.size==0)return big();
	if(a.size==1&&b.size==1){
		mom.bit[1] = a.bit[1]*b.bit[1];
		if(mom.bit[1]>9){
			mom.bit[2]+=mom.bit[1]/10;
			mom.size=2;
			mom.bit[1] %= 10;
		}
		else mom.size=1;
		return mom;
	}
	FOR(i,1,a.size/2) a0.bit[i]=a.bit[i];
	a0.size=a.size/2;
	FOR(i,a.size/2+1,a.size) a1.bit[i-a.size/2]=a.bit[i];
	a1.size=a.size-a.size/2;
	FOR(i,1,b.size/2) b0.bit[i]=b.bit[i];
	b0.size=b.size/2;
	FOR(i,b.size/2+1,b.size) b1.bit[i-b.size/2]=b.bit[i];
	b1.size=b.size-b.size/2;

	mom=pow10(a1*b1,a0.size+b0.size)+pow10(a1*b0,a0.size)+pow10(a0*b1,b0.size)+a0*b0;
	
	return mom;


}





int main()  
{  
	/*ifstream fin("G:/1.txt");*/
	char str[10];int n,dot;
	while(scanf("%s%d",str,&n)!=EOF){
		big a;
		
		for(int i=5;i>=0;i--){
			if(str[i]=='.')dot = i;
			else a.bit[++a.size]=str[i]-'0';
		}
		big b=a;
		FOR(i,1,n-1){
			a = a*b;
		}
		dot = (5-dot)*n;
		int up,down;
		for(down=1;down<=a.size;down++)
			if(a.bit[down]!=0)
				break;
		for(up=a.size;up>=1;up--)
			if(a.bit[up]!=0)
				break;
		if(up<dot) up=dot;
		if(down>dot) down=dot+1;
		for(;up>=down;up--){
			if(up==dot)printf(".");
			printf("%d",a.bit[up]);
		}
		printf("\n");
	}

	

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值