一、凑算式(全排列)

这个算式中A-I代表1~9的数字,不同的字母代表不同的数字。
全排列算法:https://www.bilibili.com/video/BV1dx411S7WR
【例】
对123全排列有:
123
132
213
231
312
321
可见有1打头的,有2打头的,有3打头的
模板:
void perm(int A[],int p,int q){
for(int i=p;i<=q;i++){
swap(A,p,i); //p和i交换位置,p打头
perm(A,p+1,q); //递归,P打头后,对p后面的继续进行全排列
swap(A,p,i); //换回去,防止有重复的
}
}
把算式通分
public class Cousuanshi {
private static int count=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
int x[]= {1,2,3,4,5,6,7,8,9};
perm(x,0,8);
System.out.println(count);
}
public static void perm(int x[],int p,int q) {
if(p>=x.length) {
int a=x[0]*x[2]*(x[6]*100+x[7]*10+x[8]);
int b=x[1]*(x[6]*100+x[7]*10+x[8]);
int c=(x[3]*100+x[4]*10+x[5])*x[2];
if(a+b+c==10*x[2]*(x[6]*100+x[7]*10+x[8]) )count++;
}
else {
for(int i=p;i<=q;i++) {
swap(x,p,i);
perm(x,p+1,q);
swap(x,p,i);
}
}
}
public static void swap(int x[],int p,int q) {
int temp=x[p];
x[p]=x[q];
x[q]=temp;
}
}
类似题目:
第八届蓝桥杯javaB组-纸牌三角形
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法

这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
public class Zhipai1 {
private static int count=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]a= {1,2,3,4,5,6,7,8,9};
perm(a,0,8);
System.out.println(count/3/2);
}
public static void perm(int a[],int p,int q) {
if(p>=a.length) {
int A=a[0]+a[1]+a[2]+a[3];
int B=a[3]+a[4]+a[5]+a[6];
int C=a[6]+a[7]+a[8]+a[0];
if(A==B && B==C && A==C) count++;
}
else {
for(int i=p;i<=q;i++) {
swap(a,p,i);
perm(a,p+1,q);
swap(a,p,i);
}
}
}
public static void swap(int a[],int p,int q) {
int temp=a[p];
a[p]=a[q];
a[q]=temp;
}
}
第六届蓝桥杯java B组-九数组分数
1,2,3…9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
把除法换成乘法
public class Jiushu {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] a= {1,2,3,4,5,6,7,8,9};
perm(a,0,8);
}
public static void perm(int a[],int p,int q) {
if(p>=a.length) {
int x=a[0]*1000+a[1]*100+a[2]*10+a[3];
int y=a[4]*10000+a[5]*1000+a[6]*100+a[7]*10+a[8];
if(x*3==y) {
System.out.println(x+" "+y);
}
}
else {
for(int i=p;i<=q;i++) { //千万别忘了'='
swap(a,p,i);
perm(a,p+1,q);
swap(a,p,i);
}
}
}
public static void swap(int a[],int p,int q) {
int temp=a[p];
a[p]=a[q];
a[q]=temp;
}
}
这篇博客探讨了使用全排列算法解决数学问题,包括将数字排列组合成特定条件的分数、纸牌三角形排列以及九数组分数问题。通过递归实现全排列,检查每种排列是否满足条件,例如分数值等于1/3,纸牌三角形边之和相等。文章提供了Java代码示例,展示了如何实现这些算法。
902

被折叠的 条评论
为什么被折叠?



