凑算式——第七届蓝桥杯C语言B组(省赛)第三题

原创


凑算式

       B      DEF
A + --- + ------- = 10
       C      GHI

(如果显示有问题,可以参见【图1.jpg】)

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

法一(枚举):

开辟9个变量分别代表1~9个数,每个变量在1~9中变化,对于每一个数字都判断是否包含1~9个数码和满足凑算式即可。

public class 凑算式 {
    public static void main(String args[]) {
        double arr[]=new double[9];
        long total=0L;
        for(arr[0]=1;arr[0]<=9;arr[0]++) {
            for(arr[1]=1;arr[1]<=9;arr[1]++) {
                for(arr[2]=1;arr[2]<=9;arr[2]++) {
                    for(arr[3]=1;arr[3]<=9;arr[3]++) {
                        for(arr[4]=1;arr[4]<=9;arr[4]++) {
                            for(arr[5]=1;arr[5]<=9;arr[5]++) {
                                for(arr[6]=1;arr[6]<=9;arr[6]++) {
                                    for(arr[7]=1;arr[7]<=9;arr[7]++) {
                                        for(arr[8]=1;arr[8]<=9;arr[8]++) {
                                            int i=0;
                                            int tt=0;
                                            int flag[]=new int[10];
                                            for(i=0;i<=8;i++) {    //判断是否包含0~9
                                                if(flag[(int)(arr[i])]==1) {
                                                    break;
                                                }
                                                flag[(int)(arr[i])]=1;
                                                tt++;
                                            }
                                            if(tt==9) {
                                                if(arr[0]+arr[1]/arr[2]+(arr[3]*100+arr[4]*10+arr[5])/(arr[6]*100+arr[7]*10+arr[8])==10) {
                                                    total++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(total);
    }
}

法二(全排列):

扫描二维码关注公众号,回复: 1516206 查看本文章

全排列的思想请看我另外一篇博客:https://www.cnblogs.com/chiweiming/p/8727164.html

每产生一种全排列,就判断是否满足凑算式即可。

public class 凑算式{
    static int total=0;
    static int arr[]=new int[9];
    
    static void Swap(int a,int b) {    //交换
        int temp=0;
        temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
    
    static void Full_Sort(int num) {    //全排列
        
        if(num==9) {    //产生一种全排列
            double a=arr[0];
            double b=arr[1];
            double c=arr[2];
            double def=arr[3]*100+arr[4]*10+arr[5];
            double ghi=arr[6]*100+arr[7]*10+arr[8];
            if(a+b/c+def/ghi==10) {
                total++;
            }
            return;
        }
        
        int i=0;
        for(i=num;i<=8;i++) {
            Swap(num,i);
            Full_Sort(num+1);
            Swap(num,i);
        }
    }
    
    public static void main(String args[]) {
        int i=0;
        for(i=0;i<=8;i++) {
            arr[i]=i+1;
        }
        Full_Sort(0);
        System.out.println(total);
    }
}

答案:29

21:10:02

2018-06-07

猜你喜欢

转载自www.cnblogs.com/chiweiming/p/9152722.html