HDU 5920 Ugly Problem(模拟)

来源:互联网 发布:初榨椰子油 知乎 编辑:程序博客网 时间:2024/06/07 08:46

这题思路比较简单,但是实现起来真的很烦……

比如一个数123456,先把它变成123321,剩下124,再变成121 和 3。

如果是654321,就先变成 653356 剩下的再递归。

特判一下10000000000这种情况,直接输出1和99999999999


这大概是我写过代码最长的模拟,撸了200多行……注意字符串手动剪切的话最后加个‘\0’;

【代码】

/* ***********************************************Author        :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a))#define LL long long#define N 1500#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}struct Bignum{    char s[N];};int a[N],b[N],c[N];Bignum operator - (Bignum q, Bignum p){    Bignum ans;    int la = strlen(q.s);    int lb = strlen(p.s);    mst(c,0);mst(a,0);mst(b,0);    for(int i = 0;i<la;i++)        a[i] = q.s[i] - '0';    for(int i = 0;i<lb;i++)        b[i] = p.s[i] - '0';    for(int i = la-1,j=lb-1;i>=0;i--,j--)    {       if(j<0)       {           c[i] = a[i];       }       if(a[i] >= b[j])       {           c[i] = a[i] - b[j];       }       else       {           a[i] += 10;           a[i-1] -= 1;           c[i] = a[i] - b[j];       }    }    int i = 0;    while(c[i]==0) i++;    mst(ans.s,0);    int j;    for(j=0;i<la;i++,j++)    {        ans.s[j] = c[i] + '0';    }    ans.s[j] = '\0';    return ans;}bool operator >= (Bignum q,Bignum p){    int la = strlen(q.s);    int lb = strlen(p.s);    if(la>lb) return 1;    if(la<lb) return 0;    for(int i=0;i<la;i++)    if(q.s[i]==p.s[i]){}    else if(q.s[i]>p.s[i]) return 1;    else if(q.s[i]<p.s[i]) return 0;    return 1;}string ans[55];Bignum get_l(Bignum n){    Bignum q; mst(q.s,0);    int len = strlen(n.s);    int j,i;    for(i=0,j=0;i<len/2;i++,j++)    {        q.s[j] = n.s[i];    }    q.s[j] = '\0';    return q;}Bignum get_r(Bignum n){    Bignum q; mst(q.s,0);    int len = strlen(n.s);    int i,j;    for(i=(len+1)/2,j=0;i<len;i++,j++)    {        q.s[j] = n.s[i];    }    q.s[j] = '\0';    return q;}int num;void dfs(Bignum x){    int len = strlen(x.s);    bool flag = 0;    for(int i =0;i<len;i++)    {        if(x.s[i] != x.s[len - i -1])        {            flag = 1;            break;        }    }    if(!flag)    {        ans[num++] = (string)x.s + '\0';        return ;    }    flag = 0;    if(x.s[0] == '1')    {        for(int i=1;i<len;i++)            if(x.s[i] != '0')            {                flag = 1;                break;            }       if(!flag)       {            Bignum tmp ;            strcpy(tmp.s ,"1");            ans[num++] = "1";            ans[num++] = (string)(x - tmp).s + '\0';;            return ;       }    }    if(len == 1)    {        if(x.s[0]!='0')            ans[num++] = x.s;        return ;    }    Bignum l = get_l(x);    Bignum r = get_r(x);    Bignum newl ;    for(int i=len/2-1;i>=0;i--)    {        newl.s[len/2-1 - i] = l.s[i];    }    if(r>=newl)    {        if(len & 1)        {             ans[num++] = (string)l.s  + x.s[len/2] + (string)newl.s + '\0';;        }        else        {            ans[num++] = (string)l.s  + (string)newl.s + '\0';;        }        //cout<< (r - newl).s<<endl;        dfs(r - newl);    }    else    {        Bignum tmp1,tmp;        strcpy(tmp1.s ,"1");        Bignum res = l - tmp1;        mst(newl.s,0);        for(int i=len/2-1;i>=0;i--)        {            newl.s[len/2-1 - i] = res.s[i];        }        if(len & 1)        {             ans[num++] = (string)res.s  + x.s[len/2] + (string)newl.s + '\0';;             for(int i=0;i<len;i++)                tmp.s[i] = ans[num-1][i];             tmp.s[len] = '\0';        }        else        {            ans[num++] = (string)res.s  + (string)newl.s + '\0';;            for(int i=0;i<len;i++)                tmp.s[i] = ans[num-1][i];            tmp.s[len] = '\0';        }        Bignum tt = x - tmp;        dfs(tt);    }}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    Bignum n;    int t,cas=1;    scan(t);    while(t--)    {        mst(n.s,0);        cin>>n.s;        REP(i,0,55) ans[i].clear();        num = 0;        dfs(n);        printf("Case #%d:\n",cas++);        printf("%d\n",num);        REP(i,0,num)           cout<<ans[i]<<'\n';    }    return 0;}


0 0
原创粉丝点击