#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;
int s;
void chen(
char a[],
char b[])
//a=a*b
{
int i,j,k,l,sum,c[
410]={
0};
l=strlen(a)+
strlen(b);
for(i=strlen(b)-
1;i>=
0;i--
)
for(j=strlen(a)-
1,k=i+j+
1;j>=
0;j--,k--
)
{ sum=(b[i]-
'0')*(a[j]-
'0')+
c[k];
c[k]=sum%
10;c[k-
1]+=sum/
10;
}
for(i=c[
0]?
0:
1,j=
0;i<l;i++
)
a[j++]=(c[i]+
'0'); a[j]=
0;
}
void quw0(
char a[])
//去除尾部多余的零
{
int i=strlen(a)-
1;
while(a[i]==
'0') {a[i]=
0;i--
;}
}
void jilu(
char a[])
{ int i,t;
for(i=
0;i<strlen(a);i++)
//判断有没有小数点
if(a[i]==
'.')
break;
if(i!=strlen(a))
//有小数点
{
for(i=strlen(a)-
1,s=
0;i>=
1;i--)
// s记录小数位数
if(a[i]!=
'.') s++
;
else break;
if(a[i=
0]==
'0')
// 0.0123变成123
{
for(i=
2;i<strlen(a);i++
)
if(a[i]!=
'0') {strcpy(a,&a[i]);
break;}
}
else //将1.4321 变成14321
{
for(t=
0,i=
1;i<strlen(a)-
1;i++
)
{ if(a[i]==
'.') t=
1;
if(t) a[i]=a[i+
1];
}
a[i]=
0;
}
}
}
void show(
char a[])
{ int i;
if(s>=strlen(a)) cout<<
'.'<<setfill(
'0')<<setw(s)<<a<<endl;
// 前面补零
else //不用补零,直接加入小数点输出
{
for(i=
0;i<strlen(a);i++
)
if(strlen(a)-s==i) {cout<<
'.'<<&a[i];
break;}
else cout<<
a[i];
cout<<
endl;
}
}
int main()
{
int n;
char b[
205],a[
205];
while(cin>>b>>
n)
{ if(n==
0) {cout<<
1<<endl;
continue;}
s=
0;
quw0(b);
jilu(b);
strcpy(a,b);
for(
int i=
2;i<=n;i++
)
chen(a,b);
s*=n;
//结果的小数位数
show(a);
}
return 0;
}
转载于:https://www.cnblogs.com/Alandre/p/3614482.html
相关资源:POJ1001的一个解决方案
转载请注明原文地址: https://win8.8miu.com/read-1487533.html