第六届蓝桥杯 三羊献瑞



三羊献瑞


观察下面的加法算式:


      祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气


(如果有对齐问题,可以参看【图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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值