HNCPC D题

大数开方

View Code
#include<iostream>
#include<string>
#include<string.h>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAXN 2000
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[MAXN];
    char left[MAXN];
    char p[MAXN];
    int i,j,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;
    }
}
void fun(char s[],char re[])
{
    int i,j,k,c=0;
    j = strlen(s) - 1;
    while(c<150){
        k = 0;
        for(i = j; i >= 0; -- i){
            s[i] = s[i] - '0' + s[i] + k;
            if(s[i]>'9')s[i] -= 10,k = 1;
            else k = 0;
        }
        re[c++] = k + '0';
    }re[c] = 0;
}
int main(){
    char s[MAXN],re[MAXN];
    char ans[MAXN];
    int i,k;
    int cas;
    scanf("%d",&cas);
    while(cas--){
        scanf("%s",s);
        strcpy(ans,s);
        re[0]=0;
        sqr(s,re);
        i=0;
        while(re[i]=='0') i++;
        strcpy(re,re+i);
        k=(int)strlen(re);

        strcpy(s,ans);
        re[0]=0;
        int len=(int)strlen(s);
        for( i=len; i<len+100; i++ ) s[i]='0';
        s[i]=0;
        sqr(s,re);
        i=0;
        while(re[i]=='0') i++;
        strcpy(re,re+i);
        int cnt=0;
        for( i=0; i<k; i++ );
        while( i<99 ) ans[cnt++]=re[i++];
        ans[cnt]=0;
        fun(ans,re);
        scanf("%s",s);
        char *p;
        p = strstr(re,s);
        printf("%d\n",p-re);
    }
    return 0;
}

posted on 2012-10-14 20:45  aigoruan  阅读(140)  评论(0)    收藏  举报

导航