C/C++ code
/**
* @file 浮点数求高精度幂.cpp
* @author 刘澜涛
* @date 2009-3-07
* @description
* 求一个浮点数的高精度幂
*/
#define LEN 200//定义一个宏
#include<stdio.h>
#include<string.h>
char str1[6]={0};//记录初始浮点数的数组
int num1[6]={0},num2[LEN]={0},num[LEN]={0};//记录转化为数字后的各位数
void mul()
{
int i,j;
for(i=0;i<=5;i++)
{
for(j=0;j<=LEN-1;j++)
num[i+j]=num[i+j]+num1[i]*num2[j];//分别计算各位的乘积,并加到对应的位置上
}
for(i=0;i<=LEN-1;i++)
{
if(num[i]>=10)
{
num[i+1]=num[i+1]+num[i]/10;
num[i]=num[i]%10;//判断各位是否需进位
}
num2[i]=num[i];
num[i]=0;
}
}
int main()
{printf直接输出数字
int n,k,i,j,point,place;
while(scanf("%s%d",str1,&n)==2)
{
k=0;
for(i=5;i>=0;i--)
{
if(str1[i]!='.')
{
num2[k]=str1[i]-'0';
num1[k++]=str1[i]-'0';//把各位字符数转化为数字并记录
}
else point=i;//记录小数点位数
}
for(i=1;i<=n-1;i++)
mul();//乘n次
i=LEN-1;
while(num2[i]==0) i--;
j=0;
while(num2[j]==0) j++;//分别到左右边第一个不是零的位置
place=n*(5-point);//计算小数点位置
if(place>=i+1)
{
printf(".");
for(k=place-1;k>=j;k--)
printf("%d",num2[k]);
printf("\n");
}//如果小数点位比前面到的两个位置所夹的长度长,则直接输出小数点并补0
else
{
if(j>place-1)
{
for(k=i;k>place-1;k--)
printf("%d",num2[k]);
}//若为整数则直接输出
else
{
for(k=i;k>=j;k--)
{
if(k==place-1)
printf(".");
printf("%d",num2[k]);
}
}//否则输出过程中在该输出小数点的位置输出小数点
printf("\n");
}
memset(str1,0,sizeof(str1));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(num,0,sizeof(num));//清零
}
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论