1 0 11 3 4 5 4 5 3 5 3 4 4 0 8 3 2 5 1 5 2 2 3
Case #1: 1 : 0 Case #2: 11 : 5554443330 Case #3: 8 : -1
思路:能被2,5整除的数末尾数字是0,能被3整除的数是各个位相加之和能被3整除。找能被3整除的数方法:
1: s%3; 2: (s-a[i])%3; 3: (s-a[i]-a[i+1])%3;
#include <stdio.h>
#include <algorithm>
using namespace std;
int num[1000000];
int main( )
{
int n;
int test;
int s; test=0;
while(~scanf("%d",&n))
{
int flag=0;
s=0;
for( int i=0;i<n;i++)
{
scanf("%d",&num[i]);
if(num[i]==0) flag=1;//保证至少有一个零
s+=num[i];
}
sort(num,num+n);
printf("Case #%d:\n",++test);
if(!flag) {printf("%d : -1\n",n);continue;}
if(s==0) {printf("%d : 0\n",n);continue;}//注意此步,若不进行处理,输入6个0将输出6个0,而不是 1个0
flag=0;
printf("%d : ",n);
//找能被3整除的数
if(s%3==0)
{
for( int i=n-1;i>=0;i--)
{
printf("%d",num[i]);
}
}
else
{
int f;
for(int i=1;i<n;i++)//i=0测试数据对但WA
{
if((s-num[i])%3==0)
{
flag=1;
f=i;
break;
}
}
if(flag)
{
for( int i=n-1;i>=0;i--)
if(i!=f)
printf("%d",num[i]);
}
else
{
for( int i=1;i<n;i++)//i=0测试数据对但WA
if((s-num[i]-num[i+1])%3==0)
{
f=i;
flag=1;
break;
}
if(flag)
{
for( int i=n-1;i>=0;i--)
{
if(i!=f&&i!=f+1)
printf("%d",num[i]);
}
}
else printf("-1");
}
}
puts("");
}
return 0;
}
链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1002&cid=16615&hide=0