桥本分数式

来源:互联网 发布:mac伪装 编辑:程序博客网 时间:2024/04/29 10:07

日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上提出以下填数趣题:把1,2,…,9这9个数字填入下式的9个方格中(数字不得重复),使下面分数等式成立:

  

桥本教授当即给出了一个解答。这一填数趣题的解是否唯一?如果不唯一究竟有多少个解?试求出所有解答 (等式左边两个分数交换次序只算一个解答)。

第一种方法:
#include <stdio.h>#include <math.h>#define M 9 int count=0;void print(int *num){printf(" %d     %d      %d\n",num[0],num[3],num[6]);printf("---- +----  =----\n");printf("%d%d    %d%d     %d%d\n\n",num[1],num[2],num[4],num[5],num[7],num[8]);}bool check(int *num){double left,right,result=0;left = num[0]*1.0/(num[1]*10.0+num[2]*1.0);right = num[3]*1.0/(num[4]*10.0+num[5]*1.0);result = num[6]*1.0/(num[7]*10.0+num[8]*1.0);if(fabs(left+right-result)<=1e-6&&num[0]<num[3])  //为避免重复,使用num[0]<num[3]{return true;}return false;}void reserve(int *num,int a){int i=0;int temp=0;if(a>=M-1){if(check(num)){count++;print(num);}return;}for(i=a;i<M;i++){temp = num[i];num[i] = num[a];num[a] = temp;reserve(num,a+1);temp = num[i];num[i] = num[a];num[a] = temp;}}int main(void){int num[M] = {1,2,3,4,5,6,7,8,9};reserve(num,0);printf("the count is:%d",count);return 0;}
第二种方法:
#include <stdio.h>#include <math.h>#define M 10int count=0;void print(int *num){printf(" %d     %d      %d\n",num[1],num[4],num[7]);printf("---- +----  =----\n");printf("%d%d    %d%d     %d%d\n\n",num[2],num[3],num[5],num[6],num[8],num[9]);}bool check(int *num){double left,right,result=0;left = num[1]*1.0/(num[2]*10.0+num[3]*1.0);right = num[4]*1.0/(num[5]*10.0+num[6]*1.0);result = num[7]*1.0/(num[8]*10.0+num[9]*1.0);if(fabs(left+right-result)<=1e-6&&num[0]<num[3]){return true;}return false;}int main(void){int num[M] = {0};int g=1;int i=1,k=0;num[i] = 1;while(1){g = 1;for(k=i-1;k>=1;k--){if(num[k]==num[i]){g=0;//  break;}}if(g&&i==9&&num[1]<num[4]){if(check(num)){count++;print(num);}}if(g&&i<9){i++;num[i]=1;continue;}while(num[i]==9&&i>1){i--;}if(num[i]==9&&i==1){break;}else{num[i]++;}}printf("the count is: %d",count);return 0;}


0 0
原创粉丝点击