曾在做牛客的小白赛遇到这样的问题,我来总结下:
牛客原题链接如下:https://ac.nowcoder.com/acm/contest/280/B,题目很简单,但是需要总结下,Accepted代码如下。
/*所有数位的和为3的倍数的数为3的倍数;
末位为5或0的数为5的倍数;末三位相加为8的倍数的数为8的倍数;
如果一个整数的奇数位上的数字之和与偶数位上的数字之和的差能
被11整除, 那么这个数可被11整除。*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 10000000007
int main()
{
string s;
cin>>s;
int a[4];
int flag = 0;
int i,j,m,n=0;
int ji=0,ou=0;
j = s.length();
for(i = 0;i < j;i++)
{
n += s[i]-'0';
if(i&1) ji += s[i]-'0';
else ou += s[i]-'0';
}
if(n%3==0) a[flag++] = 3;
if((s[j-1]-'0')%5==0) a[flag++] = 5;
if((s[j-1]-'0'+(s[j-2]-'0')*10+(s[j-3]-'0')*100)%8==0) a[flag++] = 8;
if((ji-ou)%11==0) a[flag++] = 11;
if(flag)
{
puts("Yes");
for(i=0;i<flag;i++)
cout<<a[i]<<' ';
}
else puts("No");
return 0;
}
部分数的倍数参考dalao的博客:https://blog.youkuaiyun.com/chaiwenjun000/article/details/45934073
各种数的倍数的特征:
1就不要说了;
2的所有倍数的特征:大家都知道,只要最后数位上的数字是2的倍数就行;
3的所有倍数的特征:所有数位上的数字加起来和是3的倍数即可;
4的所有倍数的特征:
(1)十位数是奇数且个位数为不是四的倍数的偶数或十位数是偶数且个位数是四的倍数;
(2)若一个整数的末尾两位数能被4整除,则这个数能被4整除,即是4的倍数 ;
5的所有倍数的特征:最后数位上的数字是5或者0即可;
6的所有倍数的特征:数位上的数字之和可以被3整除的偶数;
7的所有倍数的特征:若一个整数的个位数字截去,再从余下的数中,减去个位数的2倍,如果差是7的倍数,则原数能被7整除。如果差太大或心算不易看出是否7的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。例如,判断133是否7的倍数的过程如下:13-3×2=7,所以133是7的倍数;又例如判断6139是否7的倍数的过程如下:613-9×2=595 , 59-5×2=49,所以6139是7的倍数,余类推 。
8的所有倍数的特征:三位相加为8的倍数的数为8的倍数;
9的所有倍数的特征:其各位数字之和是9的倍数,如果继续将各位数字连加最后必然会等于9。
11的所有倍数的特征:如果一个整数的奇数位上的数字之和与偶数位上的数字之和的差能被11整除, 那么这个数可被11整除。
13的所有倍数的特征:
若一个整数的个位数字截去,再从余下的数中,加上个位数的4倍,如果和是13的倍数,则原数能被13整除。如果差太大或心算不易看出是否13的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。
若一个整数的个位数字截去,再从余下的数中,加上个位数的4倍,如果差是13的倍数,则原数能被13整除。如果差太大或心算不易看出是否13的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。
例如:判断383357能不能被13整除。
这个数的未三位数字是357,末三位以前的数字所组成的数是383,这两个数的差是:383-357=26,26能被13整除,因此,383357也一定能被13整除。
这个方法也同样适用于判断一个数能不能被7或11整除。
一个多位数的末三位数与末三位以前的数字所组成的数之差,如果能被13整除,那么,这个多位数就一定能被13整除。
17的所有倍数的特征:
若一个整数的个位数字截去,再从余下的数中,减去个位数的5倍,如果差是17的倍数,则原数能被17整除。如果差太大或心算不易看出是否17的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。
23的所有的倍数的特征:
若一个整数的末四位与前面5倍的隔出数的差能被23(或29)整除,则这个数能被23整除
后面如果再遇到其他的倍数问题,再来补充之。。。。。。。。。