大数相乘模板

题目链接: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; }

你可能感兴趣的:(String,iterator)