hngc201912211121 @ 2019-11-21 13:01:26
本人大一萌新,刚学c俩月,c++都没学,就被ACM的学长整来做这种题,脑壳疼,绝望,无助,求大佬解答思路, 希望用c来解答。
by 星际联盟 @ 2020-02-08 13:15:37
->用结构体(偷懒的我~)
高精度源码
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N=1010;
int p;
struct bigint{
char in[N];
int out[N],len;
bigint(){memset(out,0,sizeof(out));}
void scan()&
{
scanf("%s",in);
len=strlen(in);
for(re int i =0;i<len;i++)
out[len-i-1]=in[i]^48;
return ;
}
void print()&
{
for(re int i=1,k=len-1;i<=10;i++)
{
for(re int j=1;j<=50;j++,k--)
printf("%d",out[k]);
puts("");
}
return ;
}
bigint operator*(bigint &W)&
{
bigint res;
res.len=500;
for(re int i=0;i<500;i++)
for(re int j=0;j<500;j++)
res.out[i+j]+=out[i]*W.out[j];
for(re int i=0;i<res.len;i++)
if(res.out[i]>=10)
{
res.out[i+1]+=res.out[i]/10;
res.out[i]%=10;
}
return res;
}
void operator=(bigint W)&
{
len=W.len;
for(re int i =0;i<len;i++)
out[i]=W.out[i];
return ;
}
};
bigint a,ansp;
void qmi()
{
ansp.out[0]=1;
for(a.out[0]=2;p;a=(a*a),p>>=1)
if(p&1) ansp=(ansp*a);
ansp.out[0]--;
return ;
}
int main()
{
scanf("%d",&p);
printf("%d\n",(int)((double)p*log10(2)+1));
qmi();
ansp.print();
return 0;
}
by 星际联盟 @ 2020-02-08 13:23:24
高精度模板
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N=3010;
struct bigint{
char in[N];
int out[N],len;
bigint(){memset(out,0,sizeof(out));}
void scan()&
{
scanf("%s",in);
len=strlen(in);
for(re int i =0;i<len;i++)
out[len-i-1]=in[i]^48;
return ;
}
void print()&
{
while(len>1 && !out[len-1]) len--;
for(re int i =len-1;i>=0;i--)
printf("%d",out[i]);
puts("");
return ;
}
bigint operator*(bigint &W)&
{
bigint res;
res.len=W.len+len-1;
for(re int i =0;i<len;i++)
for(re int j=0;j<W.len;j++)
res.out[i+j]+=out[i]*W.out[j];
for(re int i=0;i<res.len;i++)
if(res.out[i]>=10)
{
res.out[i+1]+=res.out[i]/10;
res.out[i]%=10;
}
if(res.out[res.len]) res.len++;
return res;
}
bigint operator+(bigint &W)&
{
bigint res;
res.len=max(len,W.len);
for(re int i=0;i<res.len;i++)
res.out[i]=W.out[i]+out[i];
for(re int i =0;i<res.len;i++)
if(res.out[i]>=10)
{
res.out[i+1]+=res.out[i]/10;
res.out[i]%=10;
}
if(res.out[res.len]) res.len++;
return res;
}
void operator=(bigint W)&
{
len=W.len;
for(re int i=0;i<len;i++)
out[i]=W.out[i];
return ;
}
};
int main()
{
return 0;
}