hdu 5718(Oracle)大数加法

曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。

三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。

神谕可以看作一个不含前导零的正整数n n n。

为了得到真正的预言,他可以将n n n的各个数位重新排列,并将其分成两个不含前导零的正整数。

请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出"Uncertain".


用getchar可以一个数字一个地读入,
对于一个十进制数,最多就是10个数字,使用计数可以很方便地进行排序,再用dfs
每十位十位地进行大数相加
写dfs的时候需要注意,把保存状态的临时数组定义在dfs里面

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define SET(x) memset(x,0,sizeof(x))
using namespace std;
int vis[10];
void cacu(int x,int len)
{
    if(x==0&&len==0) return;
    if(x!=0&&len==0) {printf("%d",x);return;}
    if(x==0&&len!=0)
    {
        while(len)
        for(int i=9;i>=0;i--)
        {
            if(!vis[i]) continue;
            vis[i]--;
            printf("%d",i);
            len--;
            break;
        }
        return;
    }
    int g,f,w=0,t;
    g=x;
    t=min(10,len);
    int num1[11];
    while(t--)
    {
        for(int i=0;i<10;i++)
        {
            if(!vis[i]) continue;
            vis[i]--;
            f=i+g;
            if(f>9) g=1;
            else g=0;
            num1[w++]=f%10;
            len--;
            break;
        }
    }
    cacu(g,len);
    for(int i=max(w-1,0); i>=0; i--) printf("%d",num1[i]);
}
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    for(; T; T--)
    {
        char x;
        memset(vis,0,sizeof(vis));
        int len=0;
        while((x=getchar())&&x!='
')
        {
            vis[x-'0']++;
            len++;
        }
        if(len<=1)
        {
            puts("Uncertain");
            continue;
        }
        int flag=0,minx=10;
        for(int i=1; i<=9; i++)
        {
            if(vis[i]==1) flag++;
            else if(vis[i]>1) flag=2;
            if(vis[i]) minx=min(minx,i);
        }
        if(flag<2)
        {
            puts("Uncertain");
            continue;
        }
        vis[minx]--;
        cacu(minx,len-1);
        puts("");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zsyacm666666/p/6114940.html