三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
较为蛋疼的一道题,因为需要判断的条件太多了,比赛的时候直接排除一些简单条件后用眼睛找的,现在闲的没事把程序写出来,也没有判断所有的条件,这里介绍个小经验,这种题目可以通过判断数字出现的次数来大大减少可能。程序思路就是枚举数之后拆解,经过三级判断:1.相等的数,2.每个数的每一位互不相等,3.出现次数相同的数有几个,最终可以得到答案。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void chai(int num,int *array)
{
for(int i=0;num!=0;i++)
{
array[i]=num%10;
num/=10;
}
}
bool noe1(int *a,int len)//每个数的每一位不相等
{
int dd[10];
memset(dd,0,sizeof(dd));
for(int i=0;i<len;i++)
{
dd[a[i]]++;
if(dd[a[i]]>=2)
return false;
}
return true;
}
bool noe2(int *a1,int *a2,int *a3)//判断每个数出现的次数,1个数出现3次,5个数出现1次,2个数出现2次
{
int dd[10];
int s1=0,s2=0;//1:5 2:3
memset(dd,0,sizeof(dd));
for(int i=0;i<4;i++)
{
dd[a1[i]]++;
dd[a2[i]]++;
dd[a3[i]]++;
}
for(int i=0;i<10;i++)
{
if(dd[i]==1)
s1++;
if(dd[i]==2)
s2++;
}
if(s1==5&&s2==2)
return true;
return false;
}
bool judge(int *a1,int *a2,int *a3)
{
if(a1[1]==a3[2]&&a1[2]==a2[0]&&a2[0]==a3[1]&&a2[2]==a3[3]&&a2[3]==a3[4])
{
if(noe1(a1,4)&&noe1(a2,4)&&noe1(a3,5)&&noe2(a1,a2,a3))
return true;
}
return false;
}
int n1,n2,n3;
int ary1[4],ary2[4],ary3[5];
int main()
{
for(n1=1000;n1<=9999;n1++)
{
for(n2=1000;n2<=9999;n2++)
{
n3=n1+n2;
if(n3<9999||n3>99999)
continue;
chai(n1,ary1);
chai(n2,ary2);
chai(n3,ary3);
if(judge(ary1,ary2,ary3))
{
cout<<n1<<endl<<n2<<endl<<n3<<endl;
}
}
}
return 0;
}