题目是要求浮点数R的n次方,其中0.0 < R < 99.999,0<n<=25
完全是模拟手算,保存小数点的位置,最后点点,转换成整数的n次方,模拟大数乘小数的方法。
注意输出要求,不要输出前导零,如果是整数不要输出小数点,小数点后多余零也不要输出
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
void f(int a[],int x,int n);
int main()
{
char a[10]; //保存输入的一行
int n=0; //阶数
int dot=0; //存点的位置
while(gets(a))
{
for(dot=0;a[dot]!='.';dot++); //找到小数点的位置
int q=0;
for(q=5;a[q]=='0';q--); //找到最后一个非零数的位置
int num=q-dot; //num保存小数点后的有效位数
int sum=0; //将输入的小数转化为整数
for(int i=0;i<=q;i++)
{
if(a[i]>='0'&&a[i]<='9')
sum=sum*10+a[i]-'0';
}
if(sum==0) //由于0的n次方比较特殊,单独拿出来了
{
cout<<"0"<<endl;
continue;
}
if(a[7]==' ') //计算n
n=a[8]-'0';
else
n=(a[7]-'0')*10+a[8]-'0';
num*=n; //计算需要点点的位数
int ans[400]={1}; //保存结果
f(ans,sum,n);
int last=0;
for(last=399;ans[last]==0&&last!=num-1;last--); //找到输出的起始位置
for(;last!=-1;last--)
{
if(last==num-1)
{
cout<<".";
}
cout<<ans[last];
}
cout<<endl;
}
}
void f(int a[],int x,int n) //函数用于计算x的n次方,存入a[]数组
{
int temp=0;
while(n--)
{
for(int i=0;i!=400;i++)
{
temp+=a[i]*x;
a[i]=temp%10;
temp/=10;
}
}
}