加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 大数据 > 正文

hdu 5718 大数模拟

发布时间:2021-03-01 18:14:11 所属栏目:大数据 来源:网络整理
导读:点击打开链接 #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; 
}

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读