POJ1001 Exponentiation (解题报告)

原创 2012年03月24日 22:47:59

POJ1001 Exponentiation (解题报告)

       原文:

Exponentiation

Time Limit: 500MS

 

Memory Limit: 10000K

Total Submissions: 90091

 

Accepted: 21443

Description

Problems involving the computation of exact values ofvery large magnitude and precision are common. For example, the computation ofthe national debt is a taxing experience for many computer systems. 

This problem requires that you write a program to compute the exact value of Rn whereR is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0< n <= 25.

Input

The input will consist of a set of pairs of values for Rand n. The R value will occupy columns 1 through 6, and the n value will be incolumns 8 and 9.

Output

The output will consist of one line for each line ofinput giving the exact value of R^n. Leading zeros should be suppressed in theoutput. Insignificant trailing zeros must not be printed. Don't print thedecimal point if the result is an integer.

SampleInput

95.123 12

0.4321 20

5.1234 15

6.7592  9

98.999 10

1.0100 12

SampleOutput

548815620517731830194541.899025343415715973535967221869852721

.00000005148554641076956121994511276767154838481760200726351203835429763013462401

43992025569.928573701266488041146654993318703707511666295476720493953024

29448126.764121021618164430206909037173276672

90429072743629540498.107596019456651774561044010001

1.126825030131969720661201

Hint

If you don't know how to determine wheather encounted theend of input: 
s is a string and n is an integer 

C++


while(cin>>s>>n)


{


...


}


c


while(scanf("%s%d",s,&n)==2) //to see if the scanf read in as many items as you want


/*while(scanf(%s%d",s,&n)!=EOF) //this also work    */


{


...


}



题意:Rn 的大小,其中( 0.0 < R< 99.999,0 < n <=25 ) .

解题思路:

 

 

1、  求出小数的位数

2、  输出结果有4中可能

a)      无整数位+无小数位;

b)      无整数位+有小数位;

c)       有整数位+无小数位;

d)      有整数位+有小数位.

注意:S=”000000” 时要特别注意 !

源代码:

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

#include<string.h>

#define MAX 300

int main()

{

       int i,j,k;

       intrepeat,po,point,stop,len;

       char s[6];

       intan1[MAX],an2[6],result[MAX];

       while(scanf("%s%d",s,&repeat)!=EOF)

       {

              memset(an1,0,sizeof(an1));//初始化数组an1

              memset(an2,0,sizeof(an2));//初始化数组an2

              memset(result,0,sizeof(result)); //初始化数组result

              for(j=point=0,i=5;i>=0;i--)//赋值an1、an2.。。。

                     if(s[i]!='.')

                     {an1[j]=s[i]-'0';an2[j]=s[i]-'0';j++;}

                     else

                     {point=5-i;} //并记录小数的位数

              len=j;//记录an2的长度

              for(k=1;k<repeat;k++)

              {

                     memset(result,0,sizeof(result));

                     for(i=0;i<MAX&&i+j<MAX;i++)//开始乘

                            for(j=0;j<len;j++)

                                   result[i+j]+=an1[i]*an2[j];

                     for(i=0;i<MAX;i++)//解决进位问题

                     {

                            if(result[i]>=10)

                            {result[i+1]+=result[i]/10;result[i]=result[i]%10;}

                            an1[i]=result[i];

                     }

              }

              stop=point*repeat;//确定指整数的最后一位的位置

              for(i=0;an1[i]==0&&i<stop;i++);//从末尾跳过小数的后面无意义的零

              po=i;//记录位置

              for(i=MAX-10;an1[i]==0&&i>=stop;i--);//跳过结果前面无意义的零

              if(i==stop-1)//小数点前面没有整数

              {

                     if(po==stop)//小数点后面没有数字

                            printf("0");

                     else//小数点后面有数字

                     {

                            printf(".");

                            for(;i>=po;i--)

                                   printf("%d",an1[i]);

                     }

              }

              else//小数点前面有数字

              {

                     for(;i>=stop;i--)//输出小数点前面的数字

                            printf("%d",an1[i]);

                     if(i>=po)//判断小数点后面有没有数字

                     {

                            printf(".");

                            for(;i>=po;i--)

                            printf("%d",an1[i]);

                     }

              }

              printf("\n");//换行

       }

       return 0;

}

/*

 

95.123 12

0.4321 20

5.1234 15

6.7592  9

98.999 10

1.0100 12

 

 

548815620517731830194541.899025343415715973535967221869852721

.00000005148554641076956121994511276767154838481760200726351203835429763013462401

43992025569.928573701266488041146654993318703707511666295476720493953024

29448126.764121021618164430206909037173276672

90429072743629540498.107596019456651774561044010001

1.126825030131969720661201

 

 */


 

相关文章推荐

POJ 1001 Exponentiation解题报告

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 127985  ...

poj1001Exponentiation解题报告

思路: (1)将输入的字符串转化为整数,并记下小数点的位置; (2)将转化所得整数再次转化为字符串,进行大数相乘; (3)首先判断所得结果是否为零,若不为零,将小数点插入到结果字符串的合适位置,...

POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】

这道题目的整体思想,就是将float型数据,转化成整数,将计算float型幂次方,转变成求整数的幂次方。 然后利用数组来存储乘积的每一位。 核心代码就是那一段高精度求幂的代码,希望大家能够自己仔细...

POJ解题报告——1001 Exponentiation

POJ解题报告——1001 Exponentiation问题描述求高精度幂,输入是一个实数 R (0.0 < R < 99.999) 和 指数 n (0 < n ...
  • drop_k
  • drop_k
  • 2017年03月26日 00:22
  • 82

POJ 1001 解题报告 Exponentiation

2011-11-23 高精度浮点数计算。 花了我整整一天时间才写好,POJ上给的测试数据都通过,0的1次方和1的0次方之类的输入和加入一些干扰0的输入测试也都通过,但是提交后AC不了,显示Anws...
  • YSuffer
  • YSuffer
  • 2011年11月24日 18:34
  • 262

poj1001:1001:Exponentiation解题报告

1001:Exponentiation 查看提交统计提示提问 总时间限制: 500ms 内存限制: 65536kB 描述 Problems involvin...

POJ 1001 解题报告 高精度大整数乘法模版

有用的c++函数总结 find()函数; string成员函数有这个,algorithm库中也有这个 ,可以在容器中查找元素 string的at函数,比如string str; str.at(po...

POJ 1001 解题报告

对1001仰视了好久才下定决心把它做了,做的时候,才知道,并没有想象中的那么难,这道题,只是麻烦一些而已。          这是一道基础的高精度的题目。对于高精度的题目,头脑一定要清晰,一定要细心...

POJ1001 解题报告

POJ 1001 解题报告 140KB 47MS

poj1001解题报告(高精度浮点数乘法)

高精度浮点数的乘法,用模拟的方法可以得出结果,用数组来保存每一位,每位乘以目标乘数得到中间结果,把中间结果相加可得一次乘法结果,循环多次就得到了结果。 在本题中需要注意的是要把数据前后无用的零清理掉,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ1001 Exponentiation (解题报告)
举报原因:
原因补充:

(最多只允许输入30个字)