桥本分数式(用递归法实现全排列)

算法小作业

用递归法实现全排列,并用全排列求解下题:

把1到9 这九个数字填入上式中,数字不得重复,使等式成立,统计满足所有条件的所有解。

#include<stdio.h>
int s=0; //统计解的个数 
int a[] = {1,2,3,4,5,6,7,8,9};
int p (int a[],int c,int d) //a数组存放排列的数1~9,c代表第几个数,d数组的长度9。 
{	
	int i,temp;
	long m1,m2,m3;//分母 
	if( c==d && a[0]<a[3] )//等式左侧两个分数交换次序只算一个解,为了避免重复,设a[0]<a[3] 
	{
		m1=a[1]*10+a[2];
		m2=a[4]*10+a[5];
		m3=a[7]*10+a[8];
		if(a[0]*m2*m3+a[3]*m1*m3==a[6]*m1*m2)//判断等式 
			{	
				s++;  
				printf("(%2d)", s);
				printf("%d/%ld+%d/",a[0],m1,a[3]);
				printf("%ld=%d/%ld ",m2,a[6],m3);
				if(s%2==0)  printf("\n");//格式一行两个解 
			}
	} 
	for( i=c;i<d;i++ )//i遍历第c~d个数,每次以a[i]所存的数值为打头的数 
	{
		temp=a[c]; 
		a[c]=a[i];
		a[i]=temp;
		p(a,c+1,d);//第c+1到第d个数进行全排列 ,递归 
		temp=a[c]; 
		a[c]=a[i];
		a[i]=temp;
	}             //全排列完毕,再把第i个元素换回去,还原数组 
}

int main()
{
	p(a,0,9);
	printf("满足条件的解共有以上%d个\n",s);	
	return 0;
}

 

 

今日打卡2020-05-30

晚安呐~

桥本分数是指分子为1,分母为素数的分数,可以表示为1/p的形,其中p为素数。回溯可以用来求所有分母小于等于n的桥本分数,具体步骤如下: 1. 定义一个数组result,用来存储所有符合条件的桥本分数。 2. 定义一个递归函数backtrack,函数参数为当前分母d和当前结果res,初始值为d=2,res=1。 3. 在backtrack函数中,遍历当前分母d到n的所有素数p,计算新的结果newRes=res/p,并将新的桥本分数1/p加入result数组中。 4. 如果当前分母d小于n,则递归调用backtrack函数,参数为新的分母d和新的结果newRes。 5. 最后返回result数组。 以下是Java代码实现: ```java import java.util.*; public class BridgeNumber { public static List<Double> bridgeNumber(int n) { List<Double> result = new ArrayList<>(); backtrack(2, 1, n, result); return result; } private static void backtrack(int d, double res, int n, List<Double> result) { for (int p = d; p <= n; p++) { if (isPrime(p)) { double newRes = res / p; result.add(1 / newRes); if (d < n) { backtrack(p, newRes, n, result); } } } } private static boolean isPrime(int n) { if (n < 2) { return false; } for (int i = 2; i <= Math.sqrt(n); i++) { if (n % i == 0) { return false; } } return true; } public static void main(String[] args) { int n = 10; List<Double> result = bridgeNumber(n); System.out.println("All bridge numbers with denominator less than or equal to " + n + ":"); for (double num : result) { System.out.println(num); } } } ``` 代码中使用了一个isPrime函数来判断一个数是否为素数。如果一个数小于2,则直接返回false;否则从2到它的平方根遍历所有可能的因子,如果找到了一个能整除它的因子,则返回false;否则返回true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值