zoukankan      html  css  js  c++  java
  • 北大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;
    }


  • 相关阅读:
    51Nod 1267 4个数和为0 二分
    51Nod 1090 3个数和为0 set 二分优化
    51Nod 1001 数组中和等于K的数对 Set
    Codeforces 890C
    Codeforces 890B
    Codeforces 890A
    51nod 1058 N的阶乘的长度 位数公式
    C#调用本机摄像头
    读取、写入excel数据
    数据库笔记--基本应用
  • 原文地址:https://www.cnblogs.com/finlay/p/3234733.html
Copyright © 2011-2022 走看看