1 条题解

  • 0
    @ 2025-2-14 21:13:45

    C :

    #include <stdio.h>
    #include <memory.h>
    #define LEN 125   //每数组元素存放十进制的4位,因此数组最多只要125个元素即可。
    #include <math.h>
     /* Multiply 函数功能是计算高精度乘法a * b
     结果的末500位放在a中
    */
    void Multiply(int* a, int* b)
    {
    int i, j;
    int nCarry; //存放进位
    int nTmp;
    int c[LEN]; //存放结果的末500位
    memset(c, 0, sizeof(int) * LEN);
    for (i=0;i<LEN;i++) {
    nCarry=0;
    for (j=0;j<LEN-i;j++) {
    nTmp=c[i+j]+a[j]*b[i]+nCarry;
    c[i+j]=nTmp%10000;
    nCarry=nTmp/10000;
      }
          }
    memcpy( a, c, LEN*sizeof(int));
    }
    int main()
     {
    int i;
    int p;
    int anPow[LEN]; //存放不断增长的2的次幂
    int aResult[LEN]; //存放最终结果的末500位
    scanf("%d", & p);
    printf("%d\n", (int)(p*log10(2))+1);
     //下面将2的次幂初始化为2^(2^0)(a^b表示a的b次方),
     // 最终结果初始化为1
     anPow[0]=2;
     aResult[0]=1;
      for (i=1;i<LEN;i++) {
     anPow[i]=0;
     aResult[i]=0;
      }
     
      //下面计算2的p次方
       while (p>0)  { // p = 0 则说明p中的有效位都用过了,不需再算下去
       if ( p & 1 ) //判断此时p中最低位是否为1
      Multiply(aResult, anPow);
    
      p>>=1;
      Multiply(anPow, anPow); //乘的数据也变化!
      }
     
      aResult[0]--; //2的p次方算出后减1
     
      //输出结果
       for (i=LEN-1;i>=0;i--) {
      if (i%25==12)
      printf("%02d\n%02d", aResult[i]/100,
      aResult[i]%100);
     else {
      printf("%04d", aResult[i]);
      if (i%25==0)
      printf("\n");
      }
      }
      return 0;
      }
    
    
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    const int N=126;
    int ans[N],anspow[N];
    void mult(int ans[],int anspow[]);
    using namespace std;
    int p;
    
    int main()
    {
    	cin>>p;
    	cout<<int(log10(2)*p)+1<<endl;
    	ans[0]=1;
        anspow[0]=2;
        while(p)
        {
          if(p&1)
            mult(ans,anspow);
          p>>=1;
          mult(anspow,anspow);
        }
        ans[0]--;
        for(int i=124;i>=0;i--)
        {
          if(i%25==12)
            printf("%02d\n%02d",ans[i]/100,ans[i]%100);
          else
          {
            printf("%04d",ans[i]);
            if(i%25==0) printf("\n");
          }
        }
        return 0;
    }
    void mult(int ans[],int anspow[])
    {
       int i,j;
       int c[N];
       memset(c,0,sizeof(c));
       for(i=0;i<N;i++)
       {
         for(j=0;j<N;j++)
           if(i+j<N)
             c[i+j]+=ans[j]*anspow[i];
         for(j=0;j<N-1;j++)
           if(c[j]>=10000)
           {
             c[j+1]+=c[j]/10000;
             c[j]%=10000;
           }
       }
       memcpy(ans,c,N*sizeof(int));
    }
    

    Pascal :

    var
      n:longint;
      i,j:longint;
      out:array[1..500] of longint;
      sta:array[1..1000] of longint;
      procedure solve(n:longint);
        begin
          if n=0 then
            exit;
          solve(n div 2);
          for i:=1 to 500 do
            for j:=1 to 500 do
              if n mod 2=0
                then
                  sta[i+j-1]:=sta[i+j-1]+out[i]*out[j]
                else
                  sta[i+j-1]:=sta[i+j-1]+out[i]*out[j]*2;
          for i:=1 to 500 do
            begin
              out[i]:=sta[i] mod 10;
              sta[i+1]:=sta[i+1]+sta[i] div 10;
            end;
          for i:=1 to 1000 do   sta[i]:=0
        end;
    begin
      readln(n);
      writeln(trunc(ln(2)/ln(10)*n)+1);
      out[1]:=1;
      solve(n);
      for i:=500 downto 2 do
        begin
          write(out[i]);
          if i mod 50=1 then  writeln
        end;
      writeln(out[1]-1);
    end.
    
    • 1

    信息

    ID
    726
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者