整除15问题

给定一个只包含数字 [0..9] 的字符串,求使用字符串中的某些字符,构造一个能够被15整除的最大整数。注意,字符串中的每个字符最多只能使用一次。 输入:程序从标准输入读入数据,每行数据由一串数字组成,长度为1到1000。 输出:针对每一行输入,输出一个结果,每个结果占一行。如果无法构造出能够被15整除的整数,请输出impossible。

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 1↵
  2. 01431↵
  3. 103↵
以文本方式显示
  1. impossible↵
  2. 43110↵
  3. 30↵
1秒 64M 0
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1005];
int f[10];

void xprint()
{
	int tag=0;
	if(f[0]==0 && f[5]>0) 
	{
		f[5]--;
		tag=1;
	}
	int k=0;
	for(int i=9;i>=0;i--)
	{
		while(i && f[i]>0)
		{
			printf("%d",i);
			f[i]--;
			k=1;
		}
	}
	if(k==0 && f[0]>0) printf("0"); //如果只有0了,只输出一个0 
	else while(f[0]>0) {printf("0");f[0]--;}
	if(tag) printf("5");
	printf("\n");
}

int main(){
	while(scanf("%s",s)!=EOF)
	{
		memset(f,0,sizeof(f));
		int l=strlen(s),sum=0,flag=1;
		register int a;
		for(int i=0;i<l;i++)
		{
			a=s[i]-'0';
			sum+=a;
			f[a]++; //记录每个数字出现的次数 
		}
		if(f[0]>0 || f[5]>0)
		{
			if(sum%3==0) xprint();
			else if(sum%3==1) //剔除最小的数使sum%3=0 
			{
				if(f[1]>0)      {f[1]--; xprint();}
				else if(f[4]>0) {f[4]--; xprint();}
				else if(f[7]>0) {f[7]--; xprint();}
				else
				{
					int y=0;
					while(f[2]>0 && y<2) {f[2]--;y++; };
					if(f[0]==0) while(f[5]>1 && y<2) {f[5]--;y++; }
					else        while(f[5]>0 && y<2) {f[5]--;y++; }
					while(f[8]>0 && y<2) {f[8]--;y++; }
					if(y==2) xprint();
					else flag=0;
				} 
			}
			else if(sum%3==2)
			{
				if(f[2]>0)      {f[2]--; xprint();}
				else if((f[5]>0 && f[0]>0) || (f[0]==0 && f[5]>1)) //只有一个5没有0,则不能删除5 
				{
					            f[5]--; xprint();
				}
				else if(f[8]>0) {f[8]--; xprint();}
				else
				{
					int y=0;
					while(f[1]>0 && y<2) {f[1]--;y++; }
					while(f[4]>0 && y<2) {f[4]--;y++; }
					while(f[7]>0 && y<2) {f[7]--;y++; }
					if(y==2) xprint();
					else flag=0;
				} 
			}
		}
		else flag=0;
		if(flag==0) printf("impossible\n");
	}
	return 0;
} 

 

上一篇:YUV视频格式解析


下一篇:F - 青蛙的约会