记录编号 262482 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]大整数开方 最终得分 100
用户昵称 GravatarGaoErFu 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-05-21 00:57:22 内存使用 0.00 MiB
显示代码纯文本
#include<stdio.h>
#include<string.h>
void stbn(char *s,char *bn)
{
	int i,len=strlen(s);
	for(i=0;i<len;i++)
		bn[len-i]=s[i]-'0';
	bn[0]=len;
}
void add(char *a,char *b,char *c)
{
	int i,n;
	memset(c,0,220);
	n=a[0]>b[0]?a[0]:b[0];
	for(i=1;i<=n;i++){
		c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		c[i]%=10;
	}
	if(c[n+1])c[0]=n+1;
	else c[0]=n;
}
int sub(char *a,char *b,char *c)
{
	int i;
	memset(c,0,220);
	for(i=1;i<=a[0];i++){
		c[i]+=a[i]-b[i];
		if(c[i]<0){
			c[i]+=10;
			c[i+1]--;
		}
	}
	for(i=a[0];i>1;i--)
		if(c[i])break;
	c[0]=i;
	if(c[0]==1 && c[1]==1)return 1;
	else return 0;
}
int cmp(char *a,char *b)
{
	int i,n;
	if(a[0]!=b[0])return a[0]-b[0];
	for(i=a[0];i>0;i--)
		if(a[i]!=b[i])return a[i]-b[i];
	return 0;
}
void mul(char *a,char *b,char *c)
{
	int i,j;
	memset(c,0,220);
	for(i=1;i<=a[0];i++)
		for(j=1;j<=b[0];j++){
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	if(c[a[0]+b[0]]!=0)c[0]=a[0]+b[0];
	else c[0]=a[0]+b[0]-1;
}
void div(char *a,int b,char *c)
{
	int i,x=0;
	memset(c,0,110);
	for(i=a[0];i>0;i--){
		c[i]=(a[i]+x*10)/b;
		x=(a[i]+x*10)%b;
	}
	for(i=a[0];i>1;i--)
		if(c[i])break;
	c[0]=i;	
}
void print(char *a)
{
	int i;
	for(i=a[0];i>0;i--)
		printf("%d",a[i]);
	printf("\n");
}
int cc()
{
	freopen("hugeint.in","r",stdin);
	freopen("hugeint.out","w",stdout);
	char str[110]={0},a[110]={0},r1[110]={0},r2[110]={0},r[110]={0},tmp[220]={0};
	int c;
	scanf("%s",str);
	stbn(str,a);
	r1[0]=(a[0]+1)/2;
	r1[r1[0]]=1;	
	r2[0]=r1[0]+1;
	r2[r2[0]]=1;
	while(sub(r2,r1,tmp)!=1)	{
		add(r1,r2,tmp);
		div(tmp,2,r);
		mul(r,r,tmp);
		c=cmp(tmp,a);
		if(c==0){
			print(r);
			return 0;
		}
		else if(c>0)memcpy(r2,r,110);
		else memcpy(r1,r,110);
	}
	print(r1);
	return 0;
}
int gef=cc();
int main(){;
}