讨论 / 【求助】为什么会超时?求解决办法
shaochenrui 2013-11-25 20:37:00
点我顶贴 收藏 删除
**代码是pascal的**

program mason_number;

var

a,b:array[1..100000] of longint;

n,i,m,x,mark:longint;

begin

readln(n);

n:=n-1;

a[1]:=2;

for m:=1 to n do

begin

for i:=1 to 100000 do

begin

a[i]:=a[i]*2+x;

x:=a[i] div 10;

a[i]:=a[i] mod 10;

end;

end;

i:=0;

while a[i]=0 do

begin

i:=i+1;

end;

a[i]:=a[i]-1;

for x:=1 to i-1 do a[x]:=9;

i:=100000;

while a[i]=0 do i:=i-1;

mark:=i;

writeln(mark);

for i:=500 downto 1 do write(a[i]);

end.

#1 潘鹤翔@2014-02-05 01:50:07
回复 删除
#include<cstdio>

#include<cstring>

#include<cmath>

#include<iostream>

#define MAX_N 570

using namespace std;

typedef struct

{

long a[MAX_N];

}bign;

void mul(bign &c,bign &a,bign &b)

{

memset(c.a,0,sizeof(c.a));

for(long i=0;i<=499;i++)

for(long j=0;j<=499-i;j++)

c.a[i+j]+=a.a[i]*b.a[j];

for(long i=0;i<=499;i++)

if(c.a[i]>=10)

{

c.a[i+1]+=c.a[i]/10;

c.a[i]%=10;

}

c.a[500]=0;

}

int main()

{

long n,m,count;

bign _2[MAX_N]={{1},{2}},ans={{1}},t;

cin>>n;

cout<<(long)(n*log10(2))+1<<endl;

m=(long)(log(n)/log(2))+3;

for(long i=2;i<=m;i++)

mul(_2[i],_2[i-1],_2[i-1]);

count=0;

while(n>0)

{

if(n%2==1)

{

t=ans;

mul(ans,t,_2[count+1]);

}

count++;

n/=2;

}

ans.a[0]--;

int lona=0;

for(long i=499;i>=0;i--)

{

cout<<ans.a[i];

}

return 0;

}

#2 dog1889@2014-05-31 22:29:49
回复 删除
#include<iostream>

#include<cstdio>

#include<cmath>

#include<cstdlib>

#include<cstring>

using namespace std;

int n,sit[1004],a[504];

void ef(int x){

if(x==0)return;

else ef(x/2);

for(int i=1;i<=500;i++)

for(int j=1;j<=500;j++)

if(x%2==0)sit[i+j-1]+=a[i]*a[j];

else sit[i+j-1]+=a[i]*a[j]*2;

for(int i=1;i<=500;i++){

a[i]=sit[i]%10;

sit[i+1]+=sit[i]/10;

}

memset(sit,0,sizeof(sit));

}

int main(){

memset(sit,0,sizeof(sit));

cin>>n;

cout<<floor(log(2)/log(10)*n)+1<<endl;

a[1]=1;

ef(n);

for(int i=500;i>1;i--){

printf("%d",a[i]);

cout<<a[1]-1<<endl;

return 0;

}

用二分查找做2^n,普通做法会超时

#3 dog1889@2014-05-31 22:30:06
回复 删除
#include<iostream>

#include<cstdio>

#include<cmath>

#include<cstdlib>

#include<cstring>

using namespace std;

int n,sit[1004],a[504];

void ef(int x){

if(x==0)return;

else ef(x/2);

for(int i=1;i<=500;i++)

for(int j=1;j<=500;j++)

if(x%2==0)sit[i+j-1]+=a[i]*a[j];

else sit[i+j-1]+=a[i]*a[j]*2;

for(int i=1;i<=500;i++){

a[i]=sit[i]%10;

sit[i+1]+=sit[i]/10;

}

memset(sit,0,sizeof(sit));

}

int main(){

memset(sit,0,sizeof(sit));

cin>>n;

cout<<floor(log(2)/log(10)*n)+1<<endl;

a[1]=1;

ef(n);

for(int i=500;i>1;i--){

printf("%d",a[i]);

if(i%50==1)printf("\n");

}

cout<<a[1]-1<<endl;

system("pause");

return 0;

}

查看更多回复
提交回复