hdu5920 Ugly Problem【貪心+高精度減法】

/* ***********************************************
Author        :Maltub
Email         :[email protected]
Blog          :htttp://www.xiang578.com
************************************************ */

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define pb push_back
using namespace std;
typedef vector<int> VI;
typedef long long ll;
const ll mod=1000000007;
const int N=2048;
const int M=1e6+10;
char s[1024],t[1024];
vector<string>ans;

void sub()
{
    // printf("%s %s ",s,t);
    char x[1024];
    memset(x,0,sizeof(x));
    int m=strlen(t),n=strlen(s),j=0;
    for(int i=0; i<m; i++)
    {
        if(j==1)
        {
            if(s[i]=='0')
            {
                j=1;
                s[i]='9';
            }
            else
            {
                j=0;
                s[i]--;
            }
        }
        if(s[i]>=t[i])
        {
            x[i]=s[i]-t[i]+'0';
        }
        else
        {
            j=1;
            x[i]=s[i]+10-t[i]+'0';
        }
    }
    for(int i=m; i<n; i++)
    {
        if(j==1)
        {
            if(s[i]=='0')
            {
                j=1;
                s[i]='9';
            }
            else
            {
                j=0;
                s[i]--;
            }
        }
        x[i]=s[i];
    }
    int len=strlen(x);
    for(int i=len-1; i>=0; i--)
    {
        if(x[i]!='0') break;
        x[i]=0;
    }
    len=strlen(x);
    memset(s,0,sizeof(s));
    for(int i=0; i<len; i++)
        s[i]=x[i];
    //printf("%s\n",s);
}

void get()
{
    ans.clear();
    int n=strlen(s),k,m;
    while(n!=0)
    {
        string tmp="";
        memset(t,0,sizeof(t));
        int f=0;
        for(int i=0; i<n-1; i++)
        {
            if(s[i]!='0')
            {
                f=1;
                break;
            }
        }
        if(f==0&&s[n-1]=='1'&&n!=1)
        {
            for(int i=0; i<n-1; i++)
                t[i]='9';
        }
        else
        {
            f=1;
            k=n/2;
            for(int i=0; i<k; i++)
                t[i]=t[n-1-i]=s[n-1-i];
            if(n%2==1) t[k]=s[k];
            int j;
            for( j=k-1;j>=0;j--)
            {
                if(s[j]>s[n-1-j]) break;
                if(s[j]<s[n-1-j]) {f=0;break;}
            }
            if(!f)
            {
                if(n%2==1&&t[k]!='0')
                {
                    t[k]--;
                }
                else
                {
                    f=0;
                    for(int i=k-1;i>j;i--)
                    {
                        if(t[i]>'0')
                        {
                            t[i]--;
                            t[n-1-i]--;
                            f=1;
                            break;
                        }
                    }
                    if(f==0)
                    {
                        t[j]--;
                        t[n-1-j]--;
                        //printf("%c %c\n",t[j],s[n-1-j]);
                    }
                }
            }
        }
        m=strlen(t);
        for(int i=m-1; i>=0; i--)
        {
            tmp+=t[i];
        }
        sub();
        n=strlen(s);
        ans.push_back(tmp);
        //n=0;
        //printf("%s %s\n",s,t);
    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int _;
    scanf("%d",&_);
    for(int k=1; k<=_; k++)
    {
        scanf("%s",t);
        int n=strlen(t);
        memset(s,0,sizeof(s));
        for(int i=0; i<n; i++)
        {
            s[n-i-1]=t[i];
        }
        get();
        printf("Case #%d:\n",k);
        printf("%d\n",ans.size());
        for(int i=0; i<ans.size(); i++)
        {
            cout<<ans[i]<<endl;
        }
    }
    return 0;
}
發佈了613 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章