一个100位以下的数,能否通过删除一些字符使其能被8整除。听说有人打表过,因为被8整除的数只需要后三位被8整除即可。因为大于1000的部分一定可以用8的倍数表示。
因此这个数是否被8整除取决于后三位。一共124个,打表找。我想可以一个一个找,一共才100位,并不会超时,一开始也可以通过找0和8来剪枝。然后分2位和3位来找。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char c[105];
int leap1[105], leap2[105], leap3, pre, sum;
int main()
{
int i, j, m, n, len, leap, k;
scanf("%s",c);
memset(leap1, 0, sizeof(leap1));
memset(leap2, 0, sizeof(leap2));
len = strlen(c); leap = 0; leap3 = 0;
for (i = 0; i < len; i++)
{
if (c[i] == '0')
{
leap = 1;
}
}
if (leap == 1)
cout << "YES" << endl << "0" << endl;
else
{
for (i = 0; i < len; i++)
{
if (c[i] == '8')
{
leap = 1;
}
}
if (leap == 1)
cout << "YES" << endl << "8" << endl;
else
{
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
{
if (((c[i] - '0') * 10 + (c[j] - '0')) % 8 == 0)
{
cout << "YES" << endl << c[i] << c[j] << endl;
leap = 1;
break;
}
}
if (leap == 1)break;
}
if (!leap){
for (i = 0; i < len; i++)
{
for (j = i+1; j < len; j++)
{
for (k = j+1; k < len; k++)
{
if (((c[i] - '0') * 100 + (c[j] - '0') * 10 + (c[k] - '0')) % 8 == 0)
{
cout << "YES" << endl << c[i] << c[j] << c[k] << endl;
leap = 1;
break;
}
}
if (leap == 1)break;
}
if (leap == 1)break;
}
}
if (leap == 0)cout << "NO" << endl;
}
}
return 0;
}