您的位置:首页 > 其它

大数相乘模板

2012-02-19 18:09 344 查看
题目链接:nyist 155http://acm.nyist.net/JudgeOnline/problem.php?pid=155

分析:主要做法是先将小数化为整数,如11.23化为1123,然后再进行大数相乘之后插入小数点即可。

主要是输出的要求比较高。。 1、要注意0的情况,直接输出1即可 2、要是小数点后从某一位开始一直到末尾都是0则应删除多余的0 3、要是化为整数后大数相乘后的位数小于理论小数的位数,那么得先输出小数点后在补充不足的0 4、对于这个题目输入整数的时候是不带0的(11),但是poj 1001上需要带小数点(11.00) 5、对于整数不应该输出小数点。
我的模板相对而言显得长了点~~呵呵

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define max 200
int sum[2*max+1],sum1[max],sum2[max];
string s;
int point(string s)//返回该实数小数点的小数的位数
{ int i,pos;
for(i=0;i<s.length();i++)
if(s[i]=='.') pos=i;
return s.length()-1-pos;
}
string mul(string s1,string s2)//大数相乘
{ int i,j;
int len1=s1.length(),len2=s2.length();
memset(sum,0,sizeof(sum));
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
for(i=len1-1,j=0;i>=0;i--)
sum1[j++]=int(s1[i]-'0');
for(i=len2-1,j=0;i>=0;i--)
sum2[j++]=int(s2[i]-'0');
for(j=0;j<len2;j++)
for(i=0;i<len1;i++)
sum[i+j]+=sum2[j]*sum1[i];
for(i=0;i<2*max;i++)
if(sum[i]>=10)
{ sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
for(i=2*max-1;i>=0&&sum[i]==0;i--);
string s3="";
if(i>=0)
{ for(;i>=0;i--)
s3+=char(sum[i]+'0');
}
else s3+='0';
return s3;
}
string change(string s1)//将小数转换为整数
{ int i;
string s2="";
for(i=0;i<s1.length()&&(s1[i]=='0'||s1[i]=='.');i++);
for(;i<s1.length();i++)
if(s[i]!='.') s2+=s1[i];
return s2;
}
int main()
{ int n,i,j,sum,pos,temp,flag;
while(cin>>s>>n)
{ string s1,s3=s;
flag=1;
pos=point(s);//该实数的小数点后的小数位数
s=change(s);//转换为整数
if(n==0) //特例
{ cout<<1<<endl;
continue;
}
if(n==1) s1=s;
if(n>=2)
{ s1=mul(s,s);
for(i=0;i<n-2;i++)
s1=mul(s1,s);
}
for(i=0;i<s3.length();i++)//判断是否为整数
if(s3[i]=='.') flag=0;
if(flag) //为整形直接输出即可
{ cout<<s1<<endl;
continue;
}
string::iterator it;
it=s1.begin();
if(s1.length()>n*pos) s1.insert(it+s1.length()-n*pos,'.');//插入小数点
else //当位数不足时往小数点后面补0
{ cout<<'.';
for(i=0;i<n*pos-s1.length();i++)
cout<<'0';
}
for(i=0;i<s1.length()&&s1[i]=='0';i++) s1.erase(it+i);//删除小于1的前导0
for(i=s1.length()-1;i>=0&&s1[i]=='0';i--);//删除后面的0
for(j=0;j<=i;j++)
cout<<s1[j];
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: