首先分析一下这道题,这道题由除数3,5,7变换而来,也主要是为了强化3,5,7 中系数70 ,21, 15 的由来。
强调一下系数的是怎么来的吧。以3,5,7为例 ,进而延伸到此题上。
设需要猜的数字为 X;除数 3,5,7 告诉计算机这个数除以3,5,7得到的余数a,b,c就能给出你心中的数字。
X%3==a; (5 , 7 的系数为3的倍数 同时 a的系数对3求余等于1) S=u+3V+3W;
X%b; (3 , 7 的系数为3的倍数 同时 a的系数对5求余等于1)
X%7c; (3 , 5 的系数为3的倍数 同时 a的系数对7求余等于1)
把3,5,7,用三个整数替换即可。
同时需要注意一点,三个整数有什么限制。
经过许多测试发现三个数字,假设心中数字是10 ,三个数 为 2 ,5 ,7 余数 0 ,0,3 但是 80满足这个要求 会产生歧义,需要另外条件限制,鄙人才疏学浅 ,这个漏洞 先欠诸位 ,日后大成之后,再补上。见谅~
(这里给出个人看法,三个数不能有公约数 另外还有需要大神指导了)
多说无益,代码走起!
/*
*英文不好 函数命名见谅 依注释来看
*/
#include<iostream>
using namespace std;
int gbs(int a,int b,int c); //求三个数最小公倍数
int f_xs(int a,int b,int c); //求三个余数的系数 相当于 3,5,7 里的70,21,15
int max(int a,int b,int c); //求三个数最大值 以便求最小公倍数
int f_pd(int a,int b); //判断三个数是否有公约数
int main()
{
int a,b,c,n,y1,y2,y3; // a,b,c代表除数 n代表所要猜的数字 y1 y2 y3 代表余数
while(1){
cout<<"请输入三个除数:"<<endl;
cin>>a>>b>>c;
cout<<"请输入三个余数:"<<endl;
cin>>y1>>y2>>y3;
if(f_pd(a,b)&&f_pd(b,c)&&f_pd(a,c))
{
break;
}
else
{
cout<<"您的输入有误,请重新输入"<<endl;
}
}
int x,y,z;
x=f_xs(a,b,c);
y=f_xs(b,a,c);
z=f_xs(c,a,b);
cout<<x<<" "<<y<<" "<<z<<endl;
n=x*y1+y*y2+z*y3;
cout<<gbs(a,b,c)<<endl;
while(n>100)
{
n=n-gbs(a,b,c);
}
cout<<"心中的数字是:"<<n<<endl;
return 0;
}
//求三个数最小公倍数
int gbs(int a,int b,int c)
{
int x=max(a,b,c);
int k,i=1;
while(1)
{
k=x*i;
if(k%a==0&&k%b==0&&k%c==0)
break;
i++;
}
return k;
}
//求三个系数
int f_xs(int a,int b,int c)
{
int i;
for( i=0;i<1000;i++)
{
int temp=0;
if(i%(b*c)==0&&i%a==1)
temp=1;
if(temp==1)
{
break;
}
}
return i;
}
//求三个数最大值
int max(int a,int b,int c)
{
int x,temp;
x=max(a,b);
if(c>x){
return c;
}
return x;
}
//判断a,b,c
int f_pd(int a,int b)
{
int m;
m=a%b;
while(m!=0)
{
a=b;
b=m;
m=a%b;
}
if(b==1){
return 1;
}
return 0;
}