hdu 5718 大数模拟
发布时间:2021-02-28 04:31:17 所属栏目:大数据 来源:网络整理
导读:点击打开链接 #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
|
点击打开链接 #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,sizeof(num));
memset(f,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;
}
(编辑:清远站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

