大晚上,不想打DOTA,不想看视频,所以就随便A点题了,木哈哈,其实这种高精度的计算我以前还基本没写过,虽然也知道基本的思维是将数存在数组中,但是不知道具体怎么存的,在结合网上代码上,很快就学会了,其实很简单,核心算法就是乘法法则的实现,然后是各种前导0和去尾0的问题了。解决了以上问题,很快就把题A了。
这是AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int INF=155;
int main(void)
{
string s;
int n,point,num,up;//point代表小数位数,num表示该小数整数化后的数,up表示计算时的进位;
int a[INF];
while(cin>>s>>n)
{
num=0;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='.')
{
point=5-i;
continue;
}
num=num*10+s[i]-'0';
}
if(num==0)//特殊情况0的时候,直接输出0
{
cout<<0<<endl;
continue;
}
if(point)//去掉多余的0;
{
for(int i=5;s[i]=='0';i--)
{
num/=10;
point--;
}
}
point*=n;
memset(a,0,sizeof(a));
a[0]=1;
up=0;
for(int i=0;i<n;i++)//最核心的算法,即乘法法则的代码化;
{
for(int j=0;j<INF;j++)
{
a[j]=a[j]*num+up;
up=a[j]/10;
a[j]=a[j]%10;
}
}
int repoint;
for(int i=INF-1;i>=0;i--)
{
if(a[i]!=0)
{
repoint=i;
break;
}
}
if(repoint<point)
{
cout<<'.';
for(int i=point-1;i>=0;i--)
{
cout<<a[i];
}
cout<<endl;
}
else
{
for(int i=repoint;i>=0;i--)
{
cout<<a[i];
if(i==point&&point!=0)
{
cout<<'.';
}
}
cout<<endl;
}
}
}