548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201
来源
一道大数题目:
大数乘以整形数。注意其中的变化。
#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
string Multiply(string s,long x) //大数乘以整形数
{
reverse(s.begin(),s.end());
long cmp=0;
for(int i=0; i<s.size(); i++)
{
cmp=(s[i]-'0')*x+cmp;
s[i]=(cmp%10+'0');
cmp/=10;
}
while(cmp)
{
s+=(cmp%10+'0');
cmp/=10;
}
reverse(s.begin(),s.end());
return s;
}
string Remove_later(string s) //删除一个字符串的后倒0
{
for(int i=s.size()-1; i>=0; i--)
{
if(s[i]=='0'&&s[i]!='.')
s.erase(i);
else
break;
}
return s;
}
int main()
{
string s;
int n;
while(cin>>s>>n)
{
if(n==0)
{
printf("1n");continue;
}
string cmp="";
long x=0,point=0;
for(int i=0; i<s.size(); i++)
if(s[i]!='.')
{
cmp+=s[i];
x=x*10+(s[i]-'0');
}
else
point=s.size()-1-i;
for(int i=1; i<n; i++)
{
cmp=Multiply(cmp,x);
}
int ans_point=cmp.size()-n*point;
if(ans_point<0)
{
printf(".");
for(int i=ans_point;i!=0;i++)
printf("0");
}
string::iterator it=cmp.begin();
if(ans_point>=0&&ans_point<cmp.size())
cmp.insert(it+ans_point,'.');
cout<<Remove_later(cmp)<<endl;
}
return 0;
}