北大ACM 1001题—求高精度幂

求高精度幂
Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 118427   Accepted: 28874

Description

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。

Input

T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。

Output

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

Source

#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()
{
	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;
}


原文地址:https://www.cnblogs.com/finlay/p/3234733.html