用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次。

用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ □□□□ 成立,每个数字恰好只用一次。

以下是所有的7 个答案供参考:

12*483=5796
18*297=5346
27*198=5346
28*157=4396
39*186=7254
42*138=5796
48*159=7632

分析:

定义两位数为x,定义三位数为y,结果为z

z=x*y

分解x,y,z

x的个位:x%10 ,x的十位:x/10

y的个位:y%10 ,y的十位:y/10%10 ,y的百位:y/10

z的个位:z%10,z的十位:z/10%10 ,   z的百位:z/100%10, z的千位:z/1000

接下来解决如何保证这9个数字不重复?

使用数组a[10]记录每个数字使用的次数,初始时全为0,使用一次则加1.

代码实现:

#include
using namespace std;

bool fun(int x, int y, int z)
{
	int a[10] = { 0 };
	int k = 0;
	a[x / 10] += 1;
	a[x % 10] += 1;
	a[y % 10] += 1;
	a[y / 10 % 10] += 1;
	a[y / 100] += 1;
	a[z % 10] += 1;
	a[z / 10 % 10] += 1;
	a[z / 100 % 10] += 1;
	a[z / 1000] += 1;
	if (a[0] == 0) {//必须要去除0
		for (int i = 0; i < 10; i++)
		{
			if (a[i] == 1)
			{
				k++;
			}
		}
		if (k == 9)
			return true;
	}
	return false;
}
int main()
{
	int x, y, z;
	for (x = 12; x < 99; x++)
	{
		for (y = 123; y < 987; y++)
		{
			z = x * y;
			if (z > 9999)
				break;
			if (fun(x,y,z))
			{
				cout << x << "*" << y << "=" << z << endl;
			}
		}
	}
	return 0;
}

用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次。_第1张图片

你可能感兴趣的:(算法)