zoukankan      html  css  js  c++  java
  • 题目:麦森数

    题目描述

    形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
    任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)

    输入格式

    文件中只包含一个整数P(1000<P<3100000)

    输出格式

    第一行:十进制高精度数2^P-1的位数。
    第2-11行:十进制高精度数2^P-1的最后500位数字。(一行输出,不足500位时高位补0)
    不必验证2^P-1与P是否为素数。

    很好的一道高精度题目,花了很长时间去做这道题,因为期间我认为既然要求数的位数,必然要把它全部模拟出来,所以数据一大我的程序就爆栈了,苦恼了很长时间。

    原来有这样一个函数可以直接调用 log10(x);强大啊。

    而且写高精度的时候,c[i+j]+=a[i]*b[j];这段经常写错,要不掉了+号,要不没考虑数组的边界。

     1 #include<iostream>
     2 #include<math.h>
     3 using namespace std;
     4 
     5 int p;
     6 
     7 void Dfs(int c[],int x){
     8      if(x==1) {c[0]=2;return ;}
     9      if(x==2) {c[0]=4;return ;}
    10      
    11      int i,j,a[601]={0},b[601]={0};
    12      
    13      Dfs(a,x/2);
    14      
    15      for(i=0;i<600;++i)
    16      b[i]=a[i];
    17      if(x&1==1)
    18      for(i=0;i<600;++i) 
    19      b[i]*=2;
    20      for(i=0;i<600;++i) 
    21      if(b[i]>=10) {b[i+1]+=b[i]/10;b[i]%=10;}
    22      
    23      memset(c,0,sizeof(c));
    24      for(i=0;i<600;++i)
    25      for(j=0;j<600-i;++j)
    26      {
    27        c[i+j]+=a[i]*b[j];
    28        if(c[i+j]>=10)
    29        {
    30          c[i+j+1]+=c[i+j]/10;
    31          c[i+j]%=10; 
    32                       }
    33              }
    34      }
    35 
    36 int main()
    37 {
    38     cin>>p;
    39     cout<<int(log10(2)*p)+1<<endl;
    40     
    41     int c[601]={0},i,j;
    42     Dfs(c,p);
    43     
    44     i=0;
    45     while(c[i]==0) i++;
    46     for(j=0;j<i;++j) c[j]=9;
    47     c[i]--;
    48 
    49     for(i=499;i>=0;--i) cout<<c[i];
    50     cout<<endl;
    51     return 0;
    52     
    53     } 
  • 相关阅读:
    Android中Environment与StatFs获取系统/SDCard存储空间大小
    MySQL经常使用命令
    Quartz Cron
    【php】在Windows2003下配置Apache2.4与php5.4
    UVA 10526
    Javascript 进阶 封装
    8天玩转并行开发——第一天 Parallel的使用
    5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结
    5天玩转C#并行和多线程编程 —— 第四天 Task进阶
    5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
  • 原文地址:https://www.cnblogs.com/noip/p/2633714.html
Copyright © 2011-2022 走看看