点击打开链接 大数乘法,看过一遍别人的再写出来,用的是模仿乘法笔算的方法
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;
}