poj1001(高精度)

Exponentiation

Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 132438   Accepted: 32334

Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the 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 where R 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 R and n. The R value
will occupy columns 1 through 6, and the n value will be in columns 8
and 9.

Output

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

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

Hint

If you don‘t know how to determine wheather encounted the end 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    */
{
...
}

这题,最强大的是后台的测试数据,以至于让很多人没有AC,这题读了之后就会发现有几个关键点,一个是数据运算怎么处理,一个是做什么处理符合一些变态的数据,大数类的模拟手算。首先说一下第一个,我们运算时候待着小数点计算式肯定不方便的,所以必须除去小数点,把数据当做整数计算完,然后再加上小数点,对于小数点位置的判断程序中说明。第二个,题目中说了没意义的0不能输出,比如0.1  输出.1,比如100.10 输出100.1,我们运算可能会出现很多0,这就需要我们除去前导0,后缀零,判断数据是否大于1第三个倒是最好解决的,数据以字符接收,存入整型数组,注意存的时候最好倒着存储,这样进位好进位一些,满十进一,输出倒着输出就OK了。
 1 #include<stdio.h>
 2 #include<string.h>
 3
 4 int output[120];   //第一位为1,方便计算
 5 int m;
 6 //num是去掉小数点后的十进制数字,比如95.23变为9523
 7 //因为我们要乘的数是固定的,所以可以都去掉小数点计算,最后如果有小数点加上去就行了
 8 void cal(char str[],int num)
 9 {
10     int i;
11     for(i=0;i<m;i++)
12     {
13         output[i]=output[i]*num;       //因为最大的数可能为99999,99999*9不会超出int范围的,所以先乘好,然后再考虑进位
14     }
15     for(i=0;i<m-1;i++)
16     {
17         if(output[i]>=10)
18         {
19             output[i+1]+=output[i]/10;
20             output[i]%=10;
21         }
22     }
23     int t = output[m-1];
24     int p=m-1;
25     if(t>=10)   //把最后一个数字比如45,存储到字符数组中
26     {
27         while(t>0)
28         {
29             output[p++]=t%10;
30             t/=10;
31         }
32     }
33     m=p;
34     return ;
35 }
36
37 int main()
38 {
39     char str[6];
40     int n;
41     while(scanf("%s%d",str,&n)!=EOF)
42     {
43
44         int sum = 0,Pointsum=0;
45         int length = strlen(str),i;
46         for(i =0 ; i<length;i++)
47         {
48             if(str[i]==‘.‘)
49             {
50                 Pointsum = (length-(i+1))*n;   //记录有多少位小数
51             }
52             else
53             {
54                 sum = sum*10 + str[i]-‘0‘;       //迭代增加求完整的十进制数
55             }
56         }
57         if(sum==0)
58         {
59             printf("0\n");
60             continue;
61         }
62         memset(output,0,sizeof(output));
63         output[0]=1;
64         m=1;
65         for(i =0 ;i<n;i++)
66             cal(str,sum);
67
68         int temp = 0;
69         for(i =0 ; i<m;i++)  //先去掉后缀零
70         {
71             if(output[i]!=0)
72             {
73                 temp = i;         //第一位不为零的数字
74                 break;
75             }
76         }
77         if(Pointsum-temp<=0)   //没有小数点
78             for(i =m-1;i>=Pointsum;i--)    //temp也是非零的
79                 printf("%d",output[i]);
80         else      //有小数点
81         {
82             if(Pointsum>m)
83                 m=Pointsum;
84             for(i=m-1;i>=Pointsum;i--)
85                 printf("%d",output[i]);
86             printf(".");
87             for(;i>=temp;i--)
88                 printf("%d",output[i]);
89         }
90         printf("\n");
91
92     }
93     return 0;
94 }

poj1001(高精度)

时间: 2024-10-28 09:22:23

poj1001(高精度)的相关文章

poj1001(高精度乘法)

1.题目表述 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 135893   Accepted: 33256 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation o

POJ-1001 求高精度幂

[题目描述] 给定R与n,求Rn的精确值,其中(0.0<R<99.99, n为整数0<n<=25). [思路分析] 1. 存储结构 由于R最大不超过100,n不会超过25,故Rn不会超过50位,保险起见采用100位的int数组.数组采用与字符串的逆序方式存储,即str=”123456”中str[0]=’1’而存入int数组后,int[0]=’6’.因此,在输入时候,可以通过字符串的字符个数以及是否存在小数点来判断这个数字的位数,根据位数从最高位(str[0])开始存储数字.这样虽然

C# 高精度求幂 poj1001

高精度求幂 public static char[] exponentiation(string a,int r) { char[] aa = new char[1]; string b = ""; string c = a; for (int i = 0; i < r-1; i++) { aa = acm.Quadrature(c, a); b = ""; foreach (var item in aa) { b += item; } c = b; } re

hdu 5718 Oracle 高精度

Oracle Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description There is once a king and queen, rulers of an unnamed city, who have three daughters of conspicuous beauty. The youngest and most beautifu

问题 A: 【高精度】被限制的加法

问题 A: [高精度]被限制的加法 时间限制: 1 Sec  内存限制: 16 MB提交: 56  解决: 30[提交][状态][讨论版] 题目描述 据关押修罗王和邪狼监狱的典狱长吹嘘,该监狱自一千年前建成以来,尚未有一个囚犯能够成功地越狱.当然这应该要归功于对囚犯们严格的信息管制,例如囚犯们虽然可以自由地使用计算机,但计算机的内存被密码锁设置为仅有100KB大小,显然,在这小得可怜的内存上想编程进行任何大规模的魔法运算,几乎是不可能完成的任务.但修罗王信奉的格言是“一切皆有可能!”,为了破解掉

大数相乘-高精度乘法

一.算法简要描述 给定两个数,相乘如何得到高精度的结果,给定的两个数,不确定是不是浮点数,即可能一个数带多位小数,另一个带小数,或者两个数都带多位小数,或都不带小数,针对这些情况,程序应该都要考虑,所谓的高精度其实就是看两个数的小数位有多少,那么其结果的小数位数应该为两数小数位数之和. 二.算法思路 针对上述描述,其实大部分思路首先想到的应该是用字符串来表示这两个数,带小数点和不带小数点最终都可转换成类似于两个大整数相乘的情况,在最后考虑把小数点放到结果的合适位置即可 三.算法代码 /* two

如何构建高精度室内定位系统

高精度室内定位需要的技术 室内GIS展示 室内导航技术 高精度定位传感器 高精度定位算法 平面gis 的三维转换技术 6.  平台网络管理 这里的关键是高精度定位传感技术. 可定位的方式gps,北斗gps,蓝牙,空间定位算法

HDU 6206 Apple ( 高精度 &amp;&amp; 计算几何 &amp;&amp; 三点构圆求圆心半径 )

题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分析 : 简单的计算几何问题,如果能够知道圆心和半径(Radius)以及第四个点和圆心的距离(Distance),我们就能够判断第四个点是否在圆外,例如Distance > Radius则在圆外.三点构圆 的圆心和半径是能够推导出公式的 (参考==> http://blog.csdn.net/dea

codeforces gym 100357 H (DP 高精度)

题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选出了i张牌,数字从1~j,最后有k张牌是顺子.对于每个数字进行考虑,有0~s种选法.要保证连续c张牌的顺子. 对于组成同花的概率,令dp[i][j]表示一共选出了i张牌,颜色从1~j,.对于每种颜色进行考虑,有0~r种选法.要保证没有c张牌是相同颜色的. 最后用高精度来输出答案. 参考程序 1 #i