思路:
(1)将输入的字符串转化为整数,并记下小数点的位置;
(2)将转化所得整数再次转化为字符串,进行大数相乘;
(3)首先判断所得结果是否为零,若不为零,将小数点插入到结果字符串的合适位置,进行结果格式化;
(4)结果输出。
下面是自己摸索着写的代码,供大家参考
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int loc; //记录小数点位置,作为全局变量
//将字符串转化为整数,并记录小数点位置,返回值为字符串的整数值
int StringToInt(const string str);
//大数相乘,返回值为相乘结果
string Muling(string str1,string str2);
int count(string str);
int main()
{
//freopen("in.txt","r",stdin);
string str;
int n;
while(cin>>str>>n)
{
/*cout<<"str="<<str<<endl;
cout<<"n="<<n<<endl;*/
loc=0;
int r=StringToInt(str);
//cout<<r<<endl;
//将r转化为string类型
string str1;
stringstream ss;
ss<<r;
ss>>str1;
string str2(str1);
//cout<<"str1="<<str1<<endl;
//cout<<"str2="<<str2<<endl;
//多次相乘
for(int i=0;i<n-1;i++)
{
str1=Muling(str1,str2);
}
if(str1=="0")
{
cout<<0<<endl;
}
/*str1=Muling(str1,str2);
cout<<str1<<endl;*/
//结果格式化
else
{
loc*=n;
if(str1.length()<loc)
{
cout<<".";
for(int i=loc;i>str1.length();i--)
{
cout<<0;
}
for(int i=0;i<str1.length();++i)
{
cout<<str1[i];
}
cout<<endl;
}
else
{
loc=str1.length()-loc;
//将小数点插入str1的合适位置
string::iterator it=str1.begin()+loc;
str1.insert(it,'.');
//对小数点后全为零的处理
for(string::iterator iter=str1.end()-1;iter!=str1.begin();iter--)
{
if('0'==*iter)
{
str1.erase(iter);
}
else
{
if('.'==*iter)
{
str1.erase(iter);
}
break;
}
}
//输出结果
for(int i=0;i<str1.length();++i)
{
cout<<str1[i];
}
cout<<endl;
}
}
}
return 0;
}
int StringToInt(string str)
{
int num=0;
int len=str.length(); //获取字符串的长度
int i=1;
for(string::iterator it=str.begin();it!=str.end();++it)
{
char ch=*it;
//cout<<ch<<endl;
if(ch=='.')
{
loc=len-i;
//cout<<"loc="<<loc<<endl;
}
else
{
int temp=ch-'0';
num*=10;
num+=temp;
++i;
}
}
return num;
}
string Muling(string str1,string str2)
{
string result(str1.length()+str2.length(),'0');
for(int len2=str2.length()-1;len2>=0;len2--)
{
if(str2[len2])
{
for(int len1=str1.length()-1,len=len2+str1.length();len1>=0;len1--,len--)
{
int temp=(str1[len1]-'0')*(str2[len2]-'0');
result[len-1]=char(result[len-1]+(result[len]-'0'+temp)/10);
result[len]=char((result[len]-'0'+temp)%10+'0');
}
}
}
if(count(result)==result.length())
return "0";
return result.substr(result.find_first_not_of('0'));
}
int count(string str)
{
int count=0;
for(int i=0;i<str.length();++i)
{
if(str[i]=='0')
count++;
}
return count;
}
注释的一些语句是自己在调试过程中查看中间结果所用
提供一些测试用例:
100.00 1
.23459 1
1.0001 3
00.100 1
00.010 1
00.001 1
001.00 1
01.000 1
000.00 1
0.0000 1
00.000 1