2013年7月23号:大数的加与乘I-number&&Power of Cryptography

这个问题需要对字符与整数的来回转变要非常熟悉,不然一下转不过弯来!!!

当看到题目给的值的取值范围很大时,一般想到大数的加减乘除:                         

                              I-numberhttp://acm.hdu.edu.cn/showproblem.php?pid=4608

不解释,只要看到这个 The length of x will not exceed 105.就知道了

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<string>
 5 using namespace std;
 6 int main()
 7 {
 8     char a[200005];
 9     int h,s,i,d,t;
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%s",a);
14         d=strlen(a);
15         for(;;)
16         {
17             h=0;
18             s=0;
19             for(i=d-1;i>=0;i--)
20         {
21             if(a[i]!='9')
22                 break;
23             else
24             {
25                 a[i]='0';h++;
26             }
27         }
28         if(d-1-h<0)
29             {
30                 d++;
31                 for(i=d-1;i>0;i--)
32                     a[i]=a[i-1];
33                 a[0]='0';
34             }
35         a[d-1-h]=a[d-1-h]+1;
36         for(i=d-1;i>=0;i--)
37         {
38             s=s+a[i]-48;
39         }
40         if(s%10==0)
41            {printf("%s
",a);break;}
42         }
43     }
44     return 0;
45 }//这里使用字符串数组来进行加法的,但是用整型数组来算会清晰,不用注意太多细节。

                                   Power of Cryptographyhttp://poj.org/problem?id=2109

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(void)
 5 {
 6  double n, p;
 7  while(scanf("%lf%lf", &n, &p) != EOF)
 8  {
 9   printf("%.lf
", pow(p, 1/n));
10  }
11  return 0;
12 }

首先,题目中的数据强度并不弱,这一点确实如题目中所说:“For all such pairs 1<=n<= 200, 1<=p<10101,所以,double型是不能精确地表示出所给数据,但是却能表示出一个近似值。
当向double型变量中存入
4357186184021382204544
然后再输出,得到的是
4357186184021382000000
后六位的值变为了0,这一点和int型变量是有很大区别的。也就是说当存入double型变量的值超出了它的精度表示范围时,将低位的数据截断。(关于浮点数在计算机中的表示方法,百度吧…讲的蛮清楚的。)
在本题中,如果测试数据为:
7     4357186184021382204544
实际上所处理数据是:
7     4357186184021382000000
拿4357186184021382000000开7次方的结果自然就是1234。
为什么不是1233或者1235呢?
12337=4332529576639313702577
12347=4357186184021382204544
12357=4381962969567270546875
可以看出在double型所能表示的精度范围内,它们三个值已经不同了。
所以,此题中的测试数据也都是类似于上述情况,所以才能使用double型开n次方的方法。

 注意double的精度约为1^-300-1^300,注意神奇的pow函数

原文地址:https://www.cnblogs.com/tt123/p/3210673.html