//大数继续,额,要吐了。
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
高精度数,模拟乘法,
*********************/
Code:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define N 1000
struct Bint
{
int num[N]; //数值存储
int p;//整数位数
int del;//小数位数
int len;// 总的数位长度
};
int Find(char a,char str[])// 找小数点的位置,实际返回的是整数部分的位数
{
int i,len = strlen(str);
for(i = 0;i<len;i++)
if(str[i]==a)
return i;
return len;// 整数时直接返回 长度
}
void print(struct Bint s)// 输出函数
{
int i;
/*
if(s.p=1&&s.num[s.len-1]==0)
s.p-=1;
*/
for(i = s.p+s.del-1;i>=s.del;i--)
printf("%d",s.num[i]);
if(s.del>0){
printf(".");
for(i = s.del-1;i>=0;i--)
printf("%d",s.num[i]);
}
printf("\n");
}
void trans(Bint &a,char str[])// 将输入的字符串形式的数 转换为结构体
{
memset(a.num,0,sizeof(a.num));
int len = strlen(str);
a.p = Find(‘.‘,str);
a.del = (len==a.p)?0:(len-a.p-1);// 如果包含小数点则小数位数为 数的长度-整数位数-1
int i=0,k = 0,pa= a.p,l = len-1;
while(str[i++]==‘0‘&&i<=pa)// 去除前导0 小数点前面的 0 也不需要保存
a.p--;
while(str[l--]==‘0‘&&l>=pa)// 去除 后导 0
a.del--;
for(i = pa+a.del;i>pa;i--)// 小数位 赋值
a.num[k++] = str[i]-‘0‘;
for(i = pa-1;i>=pa-a.p;i--)
a.num[k++] = str[i]-‘0‘;
a.len = k;
}
Bint mul(Bint a,Bint b)// 模拟乘法,值存到结构体中
{
Bint m;
memset(m.num,0,sizeof(m.num));
int i,j;
for(i = 0;i<a.len;i++)
{
for(j = 0;j<b.len;j++)
{
m.num[i+j]+=a.num[i]*b.num[j];
}
}
m.del = a.del+b.del;
m.len = a.len+b.len-1;
for(i = 0;i<m.len;i++)
if(m.num[i]>=10)
{
m.num[i+1] += m.num[i]/10;
m.num[i]%=10;
}
if(m.num[m.len]>0&&m.num[m.len]<10)
m.len+=1;
else if(m.num[m.len]>10)
{
m.num[m.len+1]+=m.num[m.len]/10;
m.num[m.len]%=10;
m.len+=2;
}
m.p = m.len-m.del;
return m;
}
int main()
{
char str[N];
Bint a,s;
int n,i;
while(scanf("%s%d",str,&n)!=EOF)
{
trans(a,str);
trans(s,str);
for(i = 1;i<n;i++)
s = mul(s,a);
print(s);
}
return 0;
}
hdu 1063 Exponentiation (高精度小数乘法),布布扣,bubuko.com
hdu 1063 Exponentiation (高精度小数乘法)
原文:http://blog.csdn.net/gray_1566/article/details/24835561