zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6114940.html
Copyright © 2011-2022 走看看