nyoj34韩信点兵(中国剩余定理)

本文介绍了通过中国剩余定理解决特定数学问题的方法,并提供了两个C语言程序示例。一个程序使用穷举搜索来找到符合条件的数,另一个则直接利用定理公式计算结果。文章还解释了原理并推广到了更一般的情况。
#include<stdio.h>
int main(){
	int a,b,c;
	int flag=1;
	scanf("%d%d%d",&a,&b,&c);
	for(int i=10;i<=100;i++){
		if(i%3==a&&i%5==b&&i%7==c){
			printf("%d\n",i);
		flag=0;
		}
		
	}
	if(flag) printf("No answer\n");
	return 0;
}
#include<stdio.h>
int main(){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	int m=(70*a+21*b+15*c)%105;
	if(m<10||m>100)
	printf("No answer\n");
	else
	printf("%d\n",m);
	return 0;
}

原理(转载):


1.因为这个数能被5和7整除而不能被3整除,所以肯定是5和7的倍数,也就是35k,但是我们需要保证被3除的结果是a,所以我们令k=2,这样,70k%3=1,而k=1时,35k%3=2,所以,能被5和7整除不能被3整除且余数为a的数为70a。


2.被3和7整除,不能被5整除,则为21k,k=1时,正好余1,所以这个数为21b。


3.被3和5整除,不能被7整除,则为15k,k=1时,正好余1,所以这个数为15c。


所以,这个数为70a+21b+15c,又因为3、5、7的最小公倍数为105,所以这个数肯定在0到105以内,所以对结果取余一下即可。


推广到其他情况也是同样道理。


比如,求除以5、7、11以后所得余数为a,b,c.则这个数是:231a+330b+210c,然后对5×7×11=385取余即可。

中国剩余定理------
解法如下:假设存在一个数M M%A=a , M%B=b , M%C=c
并且A,B,C必须俩俩互质。满足这一条件下:
存在一个R1使得 , K1=A*B*R1 ,K1%C==1.
存在一个R2使得 , K2=C*B*R2,K2%A==1.
存在一个R3使得 , K3=C*A*R2,K3%B==1.
则必定满足 M=(K1*c+K2*a+k3*b)%(A*B*C);
但是此题有条件10<=M<=100;
所以可以在此范围里找,有则输出,没有则输出"No answer";


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值