能被15整除的最大整数
给定一个只包含数字 [0..9] 的字符串,求使用字符串中的某些字符,构造一个能够被15整除的最大整数。注意,字符串中的每个字符只能使用一次。 输入:程序从标准输入读入数据,每行数据由一串数字组成,长度为1到1000。 输出:针对每一行输入,输出一个结果,每个结果占一行。如果无法构造出能够被15整除的整数,请输出impossible。
测试输入
1 01431 103测试输出
impossible 43110 30源代码
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char *argv[])
{
char a[1000];
int b[10];
int len;
int i, j, sum = 0, flag = 0, temp = 0;
while( cin>>a )
{
flag = 0, temp = 0;
for( i = 0; i < 10; i++ )
b[i] = 0;
sum = 0;
len = strlen( a );
for( i = 0; i < len; i++ )
{
b[ a[i] - '0' ]++;
sum += ( a[i] - '0' );
}
if( sum == 0 )
{
cout<<"0"<<endl;
}
else if( b[0] != 0 || b[5] != 0 ) //有0和5的情况
{
if( sum % 3 == 0 )//数字串的和是3的倍数
{
if( b[0] != 0 )
{
b[0]--;
temp = 1;
}
else
b[5]--;
for( i = 9; i >= 0; i-- )//输出满足题意的结果
{
for( j = 1; j <= b[i]; j++ )
{
cout<<i;
//printf("%d",i);
}
}
if( temp == 1 ) //最后一位置为0
cout<<"0"<<endl;
else
cout<<"5"<<endl; //最后一位置为5
}
else if( sum % 3 == 1 )//数字串的和是3的倍数余1
{
for( i = 1; i <= 9; i += 3 )
{
if( b[i] != 0 )
{
b[i]--;
sum -= i;
flag = 1;
break;
}
}
if( flag == 0 )
{
if( b[2] >= 2 )
{
b[2] -= 2;
flag = 1;
sum -= 4;
}
else if( (b[2] >= 1) && (b[5] >= 1) )
{
b[2]--;
b[5]--;
flag = 1;
sum -= 7;
}
else if( b[5] >= 2 )
{
b[5] -= 2;
flag = 1;
sum -= 10;
}
else if( (b[2] >= 1) && (b[8] >= 1) )
{
b[2]--;
b[8]--;
flag = 1;
sum -= 10;
}
else if( (b[5] >= 1) && (b[8] >= 1) )
{
b[5]--;
b[8]--;
flag = 1;
sum -= 13;
}
else if( b[8] >= 2 )
{
b[8] -= 2;
flag = 1;
sum -= 16;
}
}
if( flag == 1 )
{
if( sum == 0 )
{
if( b[0] == 0 )
cout<<"impossible"<<endl;
else
cout<<"0"<<endl;
}
else
{
if( b[0] != 0 )
{
b[0]--;
temp = 1;
}
else
b[5]--;
for( i = 9; i >= 0; i-- )
{
for( j = 1; j <= b[i]; j++ )
{
cout<<i;
}
}
if( temp == 1 )
cout<<"0"<<endl;
else
cout<<"5"<<endl;
}
}
else if( b[0] != 0 )
cout<<"0"<<endl;
else
cout<<"impossible"<<endl;
}
else
{
for( i = 2; i <= 9; i += 3 )
{
if( b[i] != 0 )
{
if( b[0] == 0 && i == 5 && b[i] == 1 )
continue;
b[i]--;
sum -= i;
flag = 1;
break;
}
}
if( flag == 0 )
{
if( b[1] >= 2 )
{
b[1] -= 2;
flag = 1;
sum -= 2;
}
else if( (b[1] >= 1) && (b[4] >= 1) )
{
b[1]--;
b[4]--;
flag = 1;
sum -= 5;
}
else if( b[4] >= 2 )
{
b[4] -= 2;
flag = 1;
sum -= 8;
}
else if( (b[1] >= 1) && (b[7] >= 1) )
{
b[1]--;
b[7]--;
flag = 1;
sum -= 8;
}
else if( (b[4] >= 1) && (b[7] >= 1) )
{
b[4]--;
b[7]--;
flag = 1;
sum -= 11;
}
else if( b[7] >= 2 )
{
b[1] -= 2;
flag = 1;
sum -= 14;
}
}
if( flag == 1 )
{
if( sum == 0 )
{
if( b[0] == 0 )
cout<<"impossible"<<endl;
else
cout<<"0"<<endl;
}
else
{
if( b[0] != 0 )
{
b[0]--;
temp = 1;
}
else
b[5]--;
for( i = 9; i >= 0; i-- )
{
for( j = 1; j <= b[i]; j++ )
{
cout<<i;
}
}
if( temp == 1 )
cout<<"0"<<endl;
else
cout<<"5"<<endl;
}
}
else if( b[0] != 0 )
cout<<"0"<<endl;
else
cout<<"impossible"<<endl;
}
}
else
cout<<"impossible"<<endl;
memset( a, 0, 1000 );
}
return 0;
}