1 条题解

  • 0
    @ 2021-6-14 23:29:32

    C++ :

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int a[501],t[501],n[501];
    void suanfa(int p)
    {
    	int i,j,q;
    	memset(a,0,sizeof(a));
    	memset(t,0,sizeof(t));
    	memset(n,0,sizeof(n));
    	t[500]=1,a[500]=2;
    	if(p!=1)
    	{
    		while(p)
    		{
    			if(p&1)
    			{
    				memset(n,0,sizeof(n));
    				for(i=500;i>=1;i--)
    				{
    					for(j=500,q=i;j>=1;j--,q--)
    					{
    						if(q==0)
    							break;
    						n[q]=n[q]+t[i]*a[j];
    					}
    				}
    				for(i=500;i>=1;i--)
    				{
    					if(n[i]>=10)
    					{
    						n[i-1]=n[i]/10+n[i-1];
    						n[i]=n[i]%10;
    					}
    				}
    				for(i=500;i>=1;i--)
    					t[i]=n[i];
    			}
    			memset(n,0,sizeof(n));
    			for(i=500;i>=1;i--)
    			{
    				for(j=500,q=i;j>=1;j--,q--)
    				{
    					if(q==0)
    							break;
    					n[q]=n[q]+a[i]*a[j];
    				}
    			}
    			for(i=500;i>=1;i--)
    			{
    				if(n[i]>=10)
    				{
    					n[i-1]=n[i]/10+n[i-1];
    					n[i]=n[i]%10;
    				}
    			}
    			for(i=500;i>=1;i--)
    				a[i]=n[i];
    			p>>=1;
    		}
    	}
    	t[500]--;
    	for(i=1;i<=500;i++)
    	{
    		printf("%d",t[i]);
    		if(i%50==0)
    			puts("");
    	}
    }
    int main()
    {
    	int p;
    	scanf("%d",&p);
    	printf("%d\n",int(p*log10(2)+1));
    	suanfa(p);
    	return 0;
    }
    

    Pascal :

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