1 条题解
-
0
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
- 上传者