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函数

  • 相关阅读:
    ASP.NET网页动态添加数据行
    动态生成自定义控件ascx如何给ascx传值
    读取txt文件将文本行组合成特定格式
    怎样对文本文件内的文本行排序
    动态变更Repeater控件HeaderTemplate列名
    减少代码冗余,封装你的程序
    在Repeater控件的OnItemDataBound获取数据源记录总数
    查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
    Nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
    gerrit代码简单备份方案分享
  • 原文地址:https://www.cnblogs.com/tt123/p/3210673.html
Copyright © 2011-2022 走看看