题目链接:
题目大意:
给出一个数,问拿走某几位,能否使这个数被8整除(可以选择全部留下)
题目分析:
这道题主要考对同余模定理的理解,整个数mod8
首先看对于第i位上来说相当于 10^(i-1)*digit%8,当i>3时,10^3*10^(i-4)%8 = 0*10^(i-4) = 0
所以只考虑三位数的情况即可,1%8 = 1 , 10%8 = 2 , 100%8 = 4
那么因为取走数之后相对顺序不变,所以我们只需要枚举这三个数,取自哪几位即可,然后判断是否相加取模为0
最后构建的数一定可以作为一个三位数,除非位数不够,或者根本不能构造
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 107
using namespace std;
int num[MAX];
char s[MAX];
int main ( )
{
scanf ( "%s" , s ) ;
int len = strlen(s);
for ( int i = 0 ; i < len ; i++ )
num[s[i]-'0']++;
if ( num[8] )
{
puts ( "YES" );
puts ( "8" );
return 0;
}
if ( num[0] )
{
puts( "YES" );
puts( "0" );
return 0;
}
if ( len == 1 )
{
puts("NO");
return 0;
}
for ( int i = len-1 ; i > 0 ; i-- )
for ( int j = i-1 ; j >= 0 ; j-- )
{
int num1 = s[i]-'0';
int num2 = s[j]-'0';
if ( (num1*1 + num2*2)%8 == 0 )
{
puts("YES" );
printf ( "%d%d\n" , num2 , num1 );
return 0;
}
}
if ( len == 2 )
{
puts("NO");
return 0;
}
for ( int i = len-1 ; i >= 0 ; i-- )
for ( int j = i-1 ; j >= 0 ; j-- )
for ( int k = j-1; k >= 0 ; k-- )
{
int num1 = s[i]-'0';
int num2 = s[j]-'0';
int num3 = s[k]-'0';
if ( (num1*1 + num2*2 + num3*4)%8 == 0 )
{
puts("YES");
printf ( "%d%d%d\n" , num3,num2,num1);
return 0;
}
}
puts("NO");
return 0;
}