codefoces214b 整除问题

来源:互联网 发布:外汇行情看盘软件 编辑:程序博客网 时间:2024/06/12 22:26

/*

首先这道题的题意是所给的数中挑选可以被2,5,3同时整除的最大的数
可以不选完,即从中挑选一些,不能有前导零
0时可以;
被2,5整除,必须含有0,当全是0时,只输出一个
被三整除的数的性质 各位数加起来之和也能被3整除,当各位数和%3==2时
删除一个%3余1的 1 4 7
或者删除两个%3余2的 2 5 8
各位数和%3==1 时 同理

另附各种整除性质
被2整除 偶数
被4整除 后两位被4整除即可
被5整除 末位是0或5
被6整除 同时满足偶数和 各位数和被3整除
被7整除 ……
被8整除 后三位被8整除即可
被9整除 各位数和被9整除
如果一个数的末两位数能被4整除,该数能被4整除
如果一个数的末三位数能被8整除,该数能被8整除
如果一个数的末尾是5或0,那么该数能被5整除
如果一个数各位数之和能被3(9)整除,该数能被3(9)整除
参见https://zhidao.baidu.com/question/151751261.html
关于判断7,11,13的整除情况,是将一个多于4位的整数在百位与千位之间分为两截,形成两个数,左边的数原来的千位、万位成为个位、十位(依次类推)。
将这两个新数相减(较大的数减较小的数),所得的差不改变原来数能被7、11、13整除的特性。
这个方法可以连续使用,直到所得的差小于1000为止。
举个例子:判断71858332能否被7、11、13整除,这个数比较大,
将它分成71858、332两个数(右边是三位数)
71858-332=71526
再将71526分成71、526两个数(右边是三位数)
526-71=455
由于455数比原数小得多,
相对来说容易判断455能被7和13整除,不能被11整除,
所以原来的71858332能被7和13整除,不能被11整除

6,10,12,14,15,18这些个数,只要判断他们能不能同时被他们的约数整除就可以了,例如如果判断被6整除,只需要判断它同时能被2,3整除即可

判断被17,19整除暂时没什么好的方法 其实在实际中也不那么需要的

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int main(){    int n;    cin>>n;    int a[20]= {0};    int b[100005];    int sum = 0;    int num;    int flag1 = 0,flag2 = 0;    for(int i=1; i<=n; i++)    {        scanf("%d",&num);        sum+=num;        a[num]++;    }    if(a[0]==0)        printf("-1\n");    else    {         if(sum%3==2)        {            if(a[2]>0)            {                a[2]--;                flag1 = 1;            }            else if(a[5]>0)            {                a[5]--;                flag1 = 1;            }            else if(a[8]>0)            {                a[8]--;                flag1 = 1;            }            if(!flag1)            {                int top = 2;                while(a[1]>0&&top>0)                {                    a[1]--;                    top--;                }                while(a[4]>0&&top>0)                {                    a[4]--;                    top--;                }                while(a[7]>0&&top>0)                {                    a[7]--;                    top--;                }            }        }        else if(sum%3==1)        {            if(a[1]>0)            {                a[1]--;                flag1 = 1;            }            else if(a[4]>0)            {                a[4]--;                flag1 = 1;            }            else if(a[7]>0)            {                a[7]--;                flag1 = 1;            }            if(!flag1)            {                int top = 2;                while(a[2]>0&&top>0)                {                    a[2]--;                    top--;                }                while(a[5]>0&&top>0)                {                    a[5]--;                    top--;                }                while(a[8]>0&&top>0)                {                    a[8]--;                    top--;                }            }        }        for(int i=9; i>=1; i--)        {            for(int j=1; j<=a[i]; j++)            {                printf("%d",i);                flag2 = 1;            }        }        if(flag2)            for(int j=1;j<=a[0];j++)            printf("%d",0);        else        printf("0\n");    }    return 0;}