题目详情:
给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。
输入格式:
多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。
输出格式
每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。
答题说明:
输入样例
610
122
输出样例
YES
NO
解释
第一个数可以变为016 , 160
判断一个数n是否能被8整除
当n的位数是1位、2位或者3位时直接与8整除看余数是否为0,
当n为三位数以上时,看该数的末尾(最后)三位数是否能被8整除,如果能则该数就能被8整除
这道题的位数是不超过10000位,那可以用一个String来存放输入的数,再把它放入一个数组中去,那我们就看0~9中的数字 出现了几次,由于判断的是3位数,所以这些数字出现的次数大于3时只需记录3次即可,但如果里面的数字0或者8出现了3次或3次以上,则不用进行下面的判断,直接输出YES
最好遍历判断即可
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
while(cin >> str)
{
int a[10][2], b[30];
for(unsigned int i = 0; i < 10; i ++)
{
a[i][0] = i;
a[i][1] = 0;
b[i] = 0;
b[i + 10] = 0;
b[i + 20] = 0;
}
for(unsigned int i = 0; i < str.length(); i ++)
{
if((a[str.at(i) - '0'][1]) > 2)
continue;
a[str.at(i)-'0'][1] ++ ;
}
if(a[8][1] == 3 || a[0][1] == 3)
{
cout << "YES" << endl;
continue;
}
int t = 0;
for(unsigned int i = 0; i < 10; i ++ )
{
for(int j = 0; j < a[i][1]; j ++ )
{
b[t] = i;
t ++;
}
}
bool endl1 = true;
if(t == 1)
{
if(b[0] == 8)
cout << "YES" << endl;
else
cout << "NO" << endl;
continue;
}
else if(t == 2)
{
for(int i = 0; i < t && endl1; i ++)
{
for(int j = 0; j < t && endl1; j ++)
{
if((((b[i] * 10 + b[j]) % 8) == 0) && (i != j))
{
cout << "YES" << endl;
endl1 = false;
}
}
}
}
else
{
for(int i = 0; i < t && endl1; i ++)
{
for(int j = 0; j < t && endl1; j ++)
{
for(int k = 0; k < t && endl1; k ++)
{
if((((b[i] * 100 + b[j] * 10 + b[k]) % 8) == 0) && (i != j) && (i != k) && (j != k))
{
cout << "YES" << endl;
endl1 = false;
}
}
}
}
}
if(endl1)
cout << "NO" << endl;
}
return 0;
}