#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int M = 10010000;
int num[10],f[M],index; // num[i] 数字i出现的个数
char data[M];
void Add(int x)
{
int t=0,Index;
Index=index;//
f[index]+=x;
while(index>=1)
{
if(f[index]>=10) //处理进位
{
f[index-1]=f[index-1]+f[index]/10;
f[index]=f[index]%10;
}
index--;
}
for(int i=0;i<=Index;i++)
{
if(i==0&&f[i]==0) continue;//是否有前导0
else
cout<<f[i];
}
printf("\n");
}
int main()
{
int t;
cin>>t;
while(t--)
{
int count=0,x;
memset(num,0,sizeof(num));
memset(f,0,sizeof(f));
scanf("%s",data);
long long n=strlen(data);
for(int i=0;i<n;i++)
{
num[data[i]-'0']++;
if(data[i]-'0'>=1)
count++; //记录非0个数
}
if(count<2)//rearrange the digits and split the number into <b>two positive integers without leading zeroes
{
cout<<"Uncertain"<<endl;
}
else
{
//分成两部分时 为了使之最大 两部分位数相差越大 两部分和就越大
//所以一部分位数为n-1 另一部分位数为1&&非0
for(int i=1;i<=9;i++) //取最小一位非0
{
if(num[i])
{
x=i;
num[i]--;
break;
}
}
index=0;
//时间复杂度为 O(TN)
for(int i=9;i>=0;i--) //rearrange the digits 数字可以重新排列__就从大到小排
{
while(num[i])
{
index++;
f[index]=i;
num[i]--;
}
}
Add(x);
}
}
return 0;
}
hdu 5718 大数模拟
最新推荐文章于 2020-03-19 23:09:28 发布