CF#306-C - Divisibility by Eight-数学+暴力

给出n位数,最多100

要求你随意去掉其中几个数 (可以完全不去掉)

然后如果剩下的数字组成的数能被8整除,输出YES和那个数,否则输出NO

分情况

不超过3位的直接暴力

超过三位的 根据

如果一个数的末三位数能被8整除,那么,这个数就一定能被8整除


.暴力三层for....(这样最后只留下三位数)

还有种情况是最后剩下2位数。。。暴力两层for (这样最后只留下2位数)


注意判断前导零的情况。要就是最后留下三位或者两位 但不能有前导零


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define inf 1e9+1
char tm[105];
int sb[105];

int main()
{
    int i,j,k;
    scanf("%s",tm+1);
    int n=strlen(tm+1);
    int flag=0;
    int flag2=0;
    for (i=1;i<=n;i++)
    {
        sb[i]=tm[i]-'0'; 
        if (sb[i]==8 )
            flag=1;
            if (sb[i]==0 )
            flag2=1;
    }
    if (flag)
    {
        printf("YES\n8\n");
        return 0;
    }
    if (flag2)
    {
        printf("YES\n0\n");
        return 0;
    }
    if (n<3)
    {
        if (n==1)
        {
            if (sb[1]==8||sb[1]==0 )  
                printf("YES\n%d\n",sb[1]);
            else
                printf("NO\n");
        }
        else
        {
            if (sb[1]==8||sb[2]==8||(sb[1]*10+sb[2])%8==0||sb[2]==0)
            {
                if (sb[2]==0)
                    printf("YES\n0\n");
                else if (sb[1]==8||sb[2]==8)
                    printf("YES\n8\n");
                else
                    if ( (sb[1]*10+sb[2])%8==0)
                        printf("YES\n%d%d\n",sb[1],sb[2]);
                    
            }
            else
                printf("NO\n");
        }
        return 0;
    }
    for (i=1;i<=n;i++)
    {
        for (j=i+1;j<=n;j++)
        {
            for (k=j+1;k<=n;k++)
            {
                if ((sb[i]*100+sb[j]*10+sb[k]*1)%8==0&&sb[i]!=0)
                {
                    printf("YES\n");
                    printf("%d%d%d\n",sb[i],sb[j],sb[k]);
                    return 0; 
                }
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        for (j=i+1;j<=n;j++)
        {
            if ((sb[i]*10+sb[j]*1)%8==0&&sb[i]!=0) 
                {
                    printf("YES\n");
                    printf("%d%d\n",sb[i],sb[j]);
                    return 0; 
                }
        }
    }
    
    printf("NO\n");
    
    return 0;
    
}


你可能感兴趣的:(CF#306-C - Divisibility by Eight-数学+暴力)