zoukankan      html  css  js  c++  java
  • 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函数

  • 相关阅读:
    LOD
    优化
    Shader
    资源:创建 加载 存储 使用 ---- 热更新
    内存
    分辨率自适应
    基础知识 索引
    【转】七年IT经验的七个总结
    c#
    绘制原理
  • 原文地址:https://www.cnblogs.com/tt123/p/3210673.html
Copyright © 2011-2022 走看看