描述
日本数学家桥本吉彦教授于1973年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题:
把1,2, . . . 9这9个数填入下列算式的9个方格中(数字不得重复),使下列等式成立。
口 口 口 ———— + ———— = ————— 口口 口口 口口
桥本教授当即给出了一个解答,这一填数趣题的解是否唯一?如果不唯一究竟有多少个解?
试求出所有解答(等式左边两边分数交换次序只算一个解答)
分析
因为从1-9这9个数不能重复,那么我们便可以用全排列算出所有的情况,进而进行判断如果符合分数等式便输出。
首先我们定义一个数组a[10]来存放1-9这九个数,算式中一共有九个空,所以给每个空都附上数组的下标,如图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22EHYn29-1586243058466)(/images/桥本.png)]
然后用全排列函数next_permutation()进行全排列
另外需要注意题目中说等式左边两边分数交换次序只算一个解答,因而我们还需限制一下条件,等式左边的两个分数的分子a[1]和a[4]中要么a[1]大,要么a[4]大,易知只需要a[1]<a[4],这样的话就避开了等式左边两边分数交换次序只算一个解答的情况了
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10];
int m1,m2,m3;
for(int i=1;i<=9;i++)
{
a[i]=i;
}
do
{
if(a[1]<a[4])
{
m1=a[2]*10+a[3];
m2=a[5]*10+a[6];
m3=a[8]*10+a[9];
if(a[1]*m2*m3+a[4]*m1*m3==a[7]*m1*m2)
{
for(int i=1;i<=9;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
}while(next_permutation(a+1,a+10));
}