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

/**想一个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之间

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值