能被8整除的数

来源:互联网 发布:淘宝女装休闲鞋 编辑:程序博客网 时间:2024/05/01 17:03

CSDN挑战题

题目详情:

给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。

输入格式:

多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。

输出格式

每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。



答题说明:

输入样例  

610

122

输出样例  

YES

NO

解释  

第一个数可以变为016 , 160


分析:


#1 输入的整数位数最高可达到10000位,超出整型的范围,比如unsigned int 为 0~2^32-1,也才十几位的整数。所以用string作为输入。

#2 因为1000%8=0,所以对于任何3位数以上的数,只要其最低三位能被8整除,则该数能被8整除。


代码:


复杂度为O(n^3),超时

<span style="font-size:14px;">#include<iostream>#include<string>using namespace std;int main(){string s;while(cin>>s){int n=s.size();int *p=new int[n];for(int i=0;i<n;i++)  p[i]=s[i]-'0';if(n==1) cout<<( (p[0]==8) ? "YES":"NO")<<endl;else if(n==2) cout<<(((p[0]*10+p[1])%8==0 || (p[1]*10+p[0])%8==0)?"YES":"NO")<<endl;else{int a,b,c;bool founded=false;for(a=0;!founded &&a<n  ;a++)   for(b=0;!founded &&b<n;b++)   for(c=0;!founded &&c<n;c++)   {      if(a!=b && b!=c && a!=c)  {  if((p[a]*100+p[b]*10+p[c])%8==0)    {  cout<<"YES"<<endl;  founded=true;       }  }   }    if(!founded)  cout<<"NO"<<endl;}}return 0;}</span>

0 0