https://ac.nowcoder.com/acm/contest/329/G

题解:

std

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SET0(x) memset(x,0,sizeof(x));
#define MAXN 10010
#define DMAX 100000000
char l[MAXN],r[MAXN];
int max(int a,int b){return a>b?a:b;}
int ninepow[MAXN][1300]={0};
void out(int *src){
    for(int i=src[0];i>=1;i--){
        if(i!=src[0])
            printf("%08d",src[i]);
        else
            printf("%d",src[i]);
    }
    printf("\n");
}
void mul(int *src,int *dec,int d){
    int res=0;
    for(int i=1;i<=src[0];i++){
        dec[i]=src[i]*d;
        dec[i]+=res;
        res=dec[i]/DMAX;
        dec[i]%=DMAX;
    }
    dec[0]=src[0];
    if(res){
        dec[++dec[0]]=res;
    }
}
 
void add(int *src1,int *src2,int *dec){
    int res=0;
    for(int i=1;i<=src1[0]||i<=src2[0];i++){
        dec[i]=src1[i]+src2[i]+res;
        res=dec[i]/DMAX;
        dec[i]=dec[i]%DMAX;
    }
    dec[0]=max(src1[0],src2[0]);
    if(res){
        dec[++dec[0]]=res;
    }
}
void sub(int *src1,int *src2,int *dec){
//    out(src1);
//    printf("-\n");
//    out(src2);
    int res=0;
    for(int i=1;i<=src1[0]||i<=src2[0];i++){
        dec[i]=src1[i]-src2[i]-res;
        if(dec[i]<0){
            res=1;
        }
        else{
            res=0;
        }
        dec[i]=(dec[i]%DMAX+DMAX)%DMAX;
//        printf("%d %d ",src1[i],src2[i]);
//        printf("%d\n",dec[i]);
    }
    dec[0]=max(src1[0],src2[0]);
    while(dec[dec[0]]==0&&dec[0]>1) {
        dec[0]--;
    }
}
 
 
 
 
void cti(char *src,int *dec){
    int len=(int)strlen(src);
    dec[0]=(len-1)/8+1;
    int cnt=8-(len-1)%8-1;
    for(int i=0;i<len;i++){
        dec[dec[0]-cnt/8]*=10;
        dec[dec[0]-cnt/8]+=src[i]-'0';
        cnt++;
    }
}
 
 
int num[1300];
int tep[1300];
int sum[1300];
int ans[3][1300];
int isl;
void solve(char *s,int *ans){
    SET0(sum);
    SET0(num);
    cti(s,num);
 
//    if(isl)printf("l:");
//    else printf("r:");
//    out(num);
 
    int seven=0;
    int len=(int)strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]>'6'){
            SET0(tep);
            mul(ninepow[len-i-1],tep,s[i]-'0'-1);
            add(tep,sum,sum);
        }
        else if(s[i]=='6'){
            SET0(tep);
            mul(ninepow[len-i-1],tep,6);
            add(tep,sum,sum);
            seven=1;
            break;
        }
        else{
            SET0(tep);
            mul(ninepow[len-i-1],tep,s[i]-'0');
            add(tep,sum,sum);
        }
//        out(sum);
    }
 
    if(seven&&isl==0){
        sub(sum,ninepow[0],sum);
    }
//    printf("sum:");
//    out(sum);
//
    sub(num,sum,ans);
 
//    printf("ans:");
//    out(ans);
//    printf("\n");
}
 
int main(int argc, const char * argv[]) {
 
 
 
    ninepow[0][0]=1;
    ninepow[0][1]=1;
    for(int i=1;i<MAXN;i++)
        mul(ninepow[i-1],ninepow[i],9);
    SET0(ans);
    scanf("%s%s",l,r);
    isl=1;
    solve(l,ans[0]);
    isl=0;
    solve(r,ans[1]);
    sub(ans[1],ans[0],ans[2]);
    out(ans[2]);
    return 0;
}