曾在做牛客的小白賽遇到這樣的問題,我來總結下:
牛客原題連結如下: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.csdn.net/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整除
後面如果再遇到其他的倍數問題,再來補充之。。。。。。。。。