哈尔滨正式赛赛1003

本文分享了一段用于计算大数平方根并将其转换为二进制形式的C语言代码。该代码首先实现了一个大数开方的算法,然后将得到的结果转换成二进制输出。文章对比了不同模板的效果,并最终采用了一种更为严谨的方法。

 此题包含两个模板,第一个是计算大数的开方;第二是把字符数组表示的整数表示成二进制输出!!!

 

曾多少次吉大模板帮我不动脑筋的作出很多题,但这一次,这个大数的开方的模板害死我了!!!一直wa。。。。。。。。。。。从头到尾!!!还是中山模板严谨!!!

 

 

 #include<stdio.h> 
#include<string.h> 
#include<math.h> 
int big(char s1[],char s2[]){ 
  int  len1,len2,i,q; 
  q=0; 
  while(s1[q]=='0')  q++; 
  strcpy(s1,s1+q); 
  if(strlen(s1)==0){ 
  s1[0]='0'; 
  s1[1]=0; 
  } 
  q=0; 
  while(s2[q]=='0')  q++; 
  strcpy(s2,s2+q); 
  if(strlen(s2)==0){ 
  s2[0]='0'; 
  s2[1]=0; 
  } 
  len1=strlen(s1); 
  len2=strlen(s2); 
  if(len1>len2) 
  return 1; 
  else if(len1<len2) 
  return 0; 
  else{ 
  for(i=0;i<len1;i++){ 
  if(s1[i]>s2[i]) 
  return 1; 
    else if(s1[i]<s2[i])
      return 0; 
  } 
  } 
  return 0; 

void mul(char s[],int t,char re[]){ 
  int  left,i,j,k,len; 
  char c; 
  left=0; 
  j=0; 
  for(i=strlen(s)-1;i>=0;i--){ 
  k=t*(s[i]-'0')+left; 
  re[j++]=(k%10)+'0'; 
  left=k/10; 
  } 
  while(left>0){ 
  re[j++]=(left%10)+'0'; 
  left/=10; 
  } 
  re[j]=0; 
  len=strlen(re); 
  for(i=0;i<len/2;i++){ 
  c=re[i]; 
  re[i]=re[len-1-i]; 
  re[len-1-i]=c; 
  } 
  return; 

void sub(char a[],char b[]){ 
  int  left,len1,len2,temp,j; 
    len1=strlen(a)-1; 
  len2=strlen(b)-1; 
  left=0; 
  while(len2>=0){ 
  temp=a[len1]-b[len2]+left; 
  if(temp<0){ 
  temp+=10; 
  left=-1; 
  } 
   else 
  left=0; 
  a[len1]=temp+'0'; 
  len1--; 
  len2--; 
  } 
  while(len1>=0){ 
  temp=a[len1]-'0'+left; 
  if(temp<0){ 
    temp+=10; 
  left=-1; 
  } 
  else left=0; 
a[len1]=temp+'0'; 
len1--; 

j=0; 
while(a[j]=='0')  j++; 
    strcpy(a,a+j); 
  if(strlen(a)==0){ 
  a[0]='0'; 
  a[1]=0; 
  } 
  return; 

void sqr(char s[],char  re[]){ 
  char  temp[1010]; 
  char left[1010]; 
  char p[1010]; 
  int  i,j,k,len1,len2,q; 
  len1=strlen(s); 
  if(len1%2==0){ 
  left[0]=s[0]; 
  left[1]=s[1]; 
  left[2]=0; 
  j=2; 
  } 
  else{ 
  left[0]=s[0]; 
  left[1]=0; 
    j=1; 
   } 
  re[0]='0'; 
  re[1]=0; 
  q=0; 
  while(j<=len1){ 
  mul(re,20,temp); 
  len2=strlen(temp); 
  for(i=9;i>=0;i--){ 
  temp[len2-1]=i+'0'; 
  mul(temp,i,p); 
  if(!big(p,left)) 
  break; 
  } 
  re[q++]=i+'0'; 
  re[q]=0; 
  sub(left,p); 
  len2=strlen(left); 
  left[len2]=s[j]; 
  left[len2+1]=s[j+1]; 
  left[len2+2]=0; 
  j+=2; 
  } 

int main(){ 
  char  s[1010],re[1010]; 
  int i; 
  //freopen("test.txt","r",stdin); 
    while(scanf("%s",s)!=EOF){ 
     if(s[0]=='#') break;
  re[0]=0; 
  sqr(s,re); 
  i=0; 
  while(re[i]=='0')  i++; 
  strcpy(re,re+i); 
  //printf("%s/n",re); 
 char result[1010];
int  t_old, t;
int n, n_result=0;
while (n=strlen(re))
{
for (i=0, t_old=0;i<n;i++)
{
t = ((re[i]-'0'+t_old*10)%2);
re[i] = ((re[i]-'0'+t_old*10)/2)+'0';
t_old = t;
}
result[n_result++] = t;
if (re[0]=='0') for (i=0;i<n;i++) re[i]=re[i+1] ;
}

//printf("They are %d bits:/n", n_result);
for (i=n_result-1;i>=0;i--) printf("%c",result[i]+'0');
printf("/n");

 }
return 0;}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值