想一个1到100之间的数,分别除以357得到3个余数,把这三个余数输入计算机,计算机会猜出你想的数

来源:互联网 发布:淘宝土特产店铺简介 编辑:程序博客网 时间:2024/05/10 12:32
/**想一个1到100之间的数,分别除以357得到3个余数,把这三个余数输入计算机,计算机会猜出你想的数*/#include<iostream>using namespace std;int main(){    int a,b,c;    cin>>a>>b>>c;    int d=70*a+21*b+15*c;  while(d>105){    d=d-105;  }  cout<<d;}

解释:

a,b,c是d除以3,5,7分别的余数

d=3l+a=5m+b=7n+c

d=(3l/a+1)a=(5m/b+1)b=(7n/c+1)c

用x,y,z替换上面括号里面的分式

d=(3x+1)a=(5y+1)b=(7z+1)c

可以看到(3x+1)a是一个除以3余1的数,(5y+1)b是一个除以5余1的数,(7z+1)c是一个除以7余1的数

已知s=u+3v+3w,s%3=u%3,若s=cu+3v+3w,c是3k+1时,也就是c是除以3余1的数,s%3=u%3也是成立的

所以另d=(3x+1)a+(5y+1)b+(7z+1)c

所以b,c的系数应该被3整除,才能保证d除以3的余数与a相同

ac的系数应该被5整除,才能保证d除以5的余数与b相同

ab的系数能被7整除,才能保证d除以7的余数与c相同

所以a的系数应该是被5,7整除并且除以3余1的最小的数,是70

b的系数应该是被3,7整除并且除以5余1的最小的数,是21

c的系数应该是被3,5整除并且除以7余1的最小的数,是15

所以有了这一句
 int d=70*a+21*b+15*c;

但是这样算的结果可能超过105,就是3,5,7的最小公倍数

所以要减去105才能保证在1到100之间

阅读全文
0 0