(1)1与0的特性: 1是任何整数的约数,即对于任何整数a,总有1|a. 0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0、2、4、6或8,则这个数能被2整除。 (3)若一个整数的数字和能被3整除,则这个整数能被3整除。 (4) 若一个整数的末尾两位数能被4整除,则这个数能被4整除。 (5)若一个整数的末位是0或5,则这个数能被5整除。 (6)若一个整数能被2和3整除,则这个数能被6整除。 (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整除。 (10)若一个整数的末位是0,则这个数能被10整除。 (11)若一个整数的奇位数字之和与偶位数字之和的差能被11整除,则这个数能被11整除。11的倍数检验法也可用上述检查7的「割尾法」处理!过程唯一不同的是:倍数不是2而是1! (12)若一个整数能被3和4整除,则这个数能被12整除。 (13)若一个整数的个位数字截去,再从余下的数中,加上个位数的4倍,如果差是13的倍数,则原数能被13整除。如果差太大或心算不易看出是否13的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。 (14)若一个整数的个位数字截去,再从余下的数中,减去个位数的5倍,如果差是17的倍数,则原数能被17整除。如果差太大或心算不易看出是否17的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。 (15)若一个整数的个位数字截去,再从余下的数中,加上个位数的2倍,如果差是19的倍数,则原数能被19整除。如果差太大或心算不易看出是否19的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。 (16)若一个整数的末三位与3倍的前面的隔出数的差能被17整除,则这个数能被17整除。 (17)若一个整数的末三位与7倍的前面的隔出数的差能被19整除,则这个数能被19整除。 (18)若一个整数的末四位与前面5倍的隔出数的差能被23(或29)整除,则这个数能被23整除
-
题目描述:
-
已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k.
-
输入:
-
若干个非负整数c,c的位数<=30
每行一个c,当c=-1时中止
(不要对-1进行计算!)
-
输出:
-
每一个c的结果占一行
1) 若存在满足 c%k == 0 的k,输出所有这样的k,中间用空格隔开,最后一个k后面没有空格。
2) 若没有这样的k则输出"none"
-
样例输入:
-
30 72 13 -1
-
样例输出:
-
2 3 5 6 2 3 4 6 8 9 none
-
提示:
-
注意整数溢出问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
freopen("in.txt", "r", stdin);
char s[1];
int ans[10];
int isFirst, i, tmp, len, l1, l3, sum, m7;
while (gets(s), s[0] != '-') {
for(i=2; i<=9; i++) ans[i]=0;
isFirst = 0;
sum = 0;
m7 = 0;
len = strlen(s);
l1 = s[len - 1] - '0';
if (len >= 3)
l3 = (s[len - 3] - '0') * 100 + (s[len - 2] - '0') * 10 + l1;
else if (len == 2)
l3 = (s[len - 2] - '0') * 10 + l1;
else
l3 = l1;
for (i = 0; i < len; i++) {
tmp = s[i] - '0';
sum += tmp;
m7 *= 10;
m7 = (m7 + tmp) % 7;
}
if (m7 % 7 == 0) ans[7]=1;
if ((l3 & 7) == 0) ans[8] = ans[4] = ans[2] = 1;
else if((l3 & 3) == 0) ans[4] = ans[2] = 1;
else if ((l1 & 1) == 0) ans[2]=1;
if (sum % 9 == 0) ans[9]=ans[3]=1;
else if(sum % 3 == 0) ans[3]=1;
if(ans[3] && ans[2]) ans[6]=1;
if(l1==0 || l1==5) ans[5]=1;
for(i=2; i<=9; i++){
if(ans[i] && !isFirst){
printf("%d",i);
isFirst=1;
}
else if(ans[i]) printf(" %d",i);
}
if (!isFirst)
printf("none");
printf("\n");
}
return 0;
}