大整数余数的计算

(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值