大数相乘模板
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;
}
分析:主要做法是先将小数化为整数,如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;
}
相关文章推荐
- 【模板小程序】 十进制大数相乘(正数、负数、0均可),包含合法性检查
- poj 2389 Bull Math(可做大数相乘模板)
- 大数相乘模板
- 大数相乘模板
- 大数相乘模板
- [模板] 大数相乘模板
- 模板——大数相乘
- 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )
- 大数相乘(大数阶乘模板)
- 蓝桥杯PREV-34(数论+大数相乘大数开方模板)
- 大数相乘(简单模板)
- 大数相加 大数相乘 模板
- 我个人的大数相乘模板
- C++大数模板
- 大数相乘计算
- 大数相乘
- HDU 5047 Sawtooth (大数模板+找规律)
- 大数相乘
- 大数相乘
- A + B Problem II 1002 hdu 大数模板