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
  • 相关阅读:
    InvokeRequired和Invoke
    DataGrid 得到DataGridRow 和DataGridColumn
    DataGrid 如何得到DataGridRow 和DataGridCell 对象
    安装Extended WPF Toolkit
    WPF DataGrid绑定一个组合列
    允许Root登录Docker ubuntu(MAC主机,使用portainer管理)
    photoshop人物美白教程:暗沉肤色提亮美白
    django中聚合aggregate和annotate GROUP BY的使用方法
    Django Model 基础数据库操作应用
    如何在mac上安装gitlab
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6114940.html
Copyright © 2011-2022 走看看