回溯算法求解桥本分数式

    题目描述: 将 1-9 九个数不重复地赋给不同的 9 个元素 ,实现形如 a/bc+d/ef=f/hi 的形式: 例:1/26+5/78=4/39 1/32+5/96=7/84 (注意:1/26+5/78=4/39 和 5/78+1/26=4/39 只能算一种解) 求满足条件的解共有多少个?                  思路: 要用回溯法

    可见问题的解空间是9位的整数组,其约束条件是9位数字中没有相同的数字且必须满足分数式的要求。为此设置a数组,式中每一个数用一个数组元素表示:a[1]/a[2]a[3]+a[4]/a[5]a[6] = a[7]/a[8]a[9]。同时式中三个分母分别为:

m1 = a[2]a[3] = a[2]*10+a[3];  m2 = a[5]a[6] = a[5]*10+a[6];  m3 = a[8]a[9] = a[8]*10+a[9]

    注意到等式左侧两分数交换次序只算一个解,为了避免重复,令a[1] < a[4]。

回溯程序代码:

#include<stdio.h>
void main()
{
	int g, i, k, s, a[10];
	long m1, m2, m3;
	i = 1;
	a[1] = 1;
	s = 0;
	while (1) 
	{
		g = 1;
		for (k = i - 1; k >= 1; k--)
		{
			if (a[i] = a[k])
			{
				g = 0;
				break;
			}
		}
		if (i == 9 && g == 1 && a[1] < a[4])
		{
			m1= a[2] * 10 + a[3];  
			m2 = a[5] * 10 + a[6];  
			m3 = a[8] * 10 + a[9];
			if (a[1] * m2*m3 + a[4] * m1*m3 == a[7] * m1*m2)
			{
				printf("(%2d)", ++s);
				printf("%d/%ld+%d/%ld = %d/%ld", a[1], m1, a[4], m2, a[7], m3);
				if (s % 2 == 0) { printf("\n"); }
			}
		}
		if (i < 9 && g == 1) 
		{ i++; a[i] = 1; continue; }
		while (a[i] == 9 && i > 1) 
		{ 
			i--; }
		if (a[i] == 9 && i == 1) 
		{
			break;
		}
		else
		{
			a[i]++;
		}
	}
	printf("共有以上%d个解。\n", s);
}



  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值