原创
三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
分析:三羊生瑞气这个数中三只能是数码1,所以其他7个数字不必考虑是1
法一(枚举):
枚举祥、瑞、生、辉、羊、献、气这7个字,然后判断是否满足等式即可。
public class 三羊献瑞 { public static void main(String args[]) { int tt=0; int arr[]=new int[7]; for(arr[0]=2;arr[0]<=9;arr[0]++) { //祥 for(arr[1]=0;arr[1]<=9;arr[1]++) { //瑞 if(arr[1]==1) { continue; } for(arr[2]=0;arr[2]<=9;arr[2]++) { //生 if(arr[2]==1) { continue; } for(arr[3]=0;arr[3]<=9;arr[3]++) { //辉 if(arr[3]==1) { continue; } for(arr[4]=0;arr[4]<=9;arr[4]++) { //羊 if(arr[4]==1) { continue; } for(arr[5]=0;arr[5]<=9;arr[5]++) { //献 if(arr[5]==1) { continue; } for(arr[6]=0;arr[6]<=9;arr[6]++) { //气 if(arr[6]==1) { continue; } int flag[]= {0,0,0,0,0,0,0,0,0,0}; int i=0; int ff=0; for(i=0;i<=6;i++) { //判断是否包含相同的数码 if(flag[arr[i]]==1) { ff=1; break; } flag[arr[i]]=1; } if(ff==1) { //有相同数码 continue; } if((arr[0]*1000+arr[1]*100+arr[2]*10+arr[3])+(1000+arr[4]*100+arr[5]*10+arr[1])==10000+arr[4]*1000+arr[2]*100+arr[1]*10+arr[6]) { System.out.println(1000+arr[4]*100+arr[5]*10+arr[1]); tt=1; } if(tt==1) { break; } } if(tt==1) { break; } } if(tt==1) { break; } } if(tt==1) { break; } } if(tt==1) { break; } } if(tt==1) { break; } } if(tt==1) { break; } } } }
法二(全排列):
全排列思想看我另外一篇博客:https://www.cnblogs.com/chiweiming/p/8727164.html
对0、2、3、4、5、6、7、8、9这8个数码进行全排列,每产生一种全排列就将全排列前7
位数取出进行运算,满足条件算式输出即可。
public class 三羊献瑞{ static int flag=0; static int arr[]= {0,2,3,4,5,6,7,8,9}; static void Swap(int a,int b) { int temp=0; temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } static void Quan(int num) { if(num==8) { //产生一种全排列 if((arr[0]*1000+arr[1]*100+arr[2]*10+arr[3])+(1000+arr[4]*100+arr[5]*10+arr[1])==10000+arr[4]*1000+arr[2]*100+arr[1]*10+arr[6]) { System.out.println(1000+arr[4]*100+arr[5]*10+arr[1]); flag=1; } return; } int i=0; for(i=num;i<=8;i++) { Swap(i,num); Quan(num+1); if(flag==1) { return; } Swap(i,num); } } public static void main(String args[]) { Quan(0); } }
答案:1085
22:07:35
2018-06-08