//大数继续,额,要吐了。
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