欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三羊献瑞——第六届蓝桥杯C语言B组(省赛)第三题

程序员文章站 2022-04-23 08:09:51
原创 三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 三 羊 生 瑞 气 (如果有对齐问题,可以参看【图1.jpg】) 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 分析:三羊生瑞气这个数中三 ......

原创


三羊献瑞

观察下面的加法算式:

    祥 瑞 生 辉
 + 三 羊 献 瑞
 -------------------
三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

三羊献瑞——第六届蓝桥杯C语言B组(省赛)第三题

分析:三羊生瑞气这个数中只能是数码1,所以其他7个数字不必考虑是1

法一(枚举):

枚举祥、瑞、生、辉、羊、献、气这7个字,然后判断是否满足等式即可。

public class 三羊献瑞 {
    public static void main(String args[]) {
        int tt=0;
        int arr[]=new int[7];
        for(arr[0]=2;arr[0]<=9;arr[0]++) {    //祥
            for(arr[1]=0;arr[1]<=9;arr[1]++) {    //瑞
                if(arr[1]==1) {
                    continue;
                }
                for(arr[2]=0;arr[2]<=9;arr[2]++) {    //生
                    if(arr[2]==1) {
                        continue;
                    }
                    for(arr[3]=0;arr[3]<=9;arr[3]++) {    //辉
                        if(arr[3]==1) {
                            continue;
                        }
                        for(arr[4]=0;arr[4]<=9;arr[4]++) {    //羊
                            if(arr[4]==1) {
                                continue;
                            }
                            for(arr[5]=0;arr[5]<=9;arr[5]++) {    //献
                                if(arr[5]==1) {
                                    continue;
                                }
                                for(arr[6]=0;arr[6]<=9;arr[6]++) {    //气
                                    if(arr[6]==1) {
                                        continue;
                                    }
                                    int flag[]= {0,0,0,0,0,0,0,0,0,0};
                                    int i=0;
                                    int ff=0;
                                    for(i=0;i<=6;i++) {    //判断是否包含相同的数码
                                        if(flag[arr[i]]==1) {
                                            ff=1;
                                            break;
                                        }
                                        flag[arr[i]]=1;
                                    }
                                    if(ff==1) {    //有相同数码
                                        continue;
                                    }
                                    if((arr[0]*1000+arr[1]*100+arr[2]*10+arr[3])+(1000+arr[4]*100+arr[5]*10+arr[1])==10000+arr[4]*1000+arr[2]*100+arr[1]*10+arr[6]) {
                                        System.out.println(1000+arr[4]*100+arr[5]*10+arr[1]);
                                        tt=1;
                                    }
                                    if(tt==1) {
                                        break;
                                    }
                                }
                                if(tt==1) {
                                    break;
                                }
                            }
                            if(tt==1) {
                                break;
                            }
                        }
                        if(tt==1) {
                            break;
                        }
                    }
                    if(tt==1) {
                        break;
                    }
                }
                if(tt==1) {
                    break;
                }
            }
            if(tt==1) {
                break;
            }
        }
    }
}

法二(全排列):

全排列思想看我另外一篇博客:

0、2、3、4、5、6、7、8、9这8个数码进行全排列,每产生一种全排列就将全排列前7

位数取出进行运算,满足条件算式输出即可。

public class 三羊献瑞{
    static int flag=0;
    static int arr[]= {0,2,3,4,5,6,7,8,9};
    static void Swap(int a,int b) {
        int temp=0;
        temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
    static void Quan(int num) {
        if(num==8) {    //产生一种全排列
            if((arr[0]*1000+arr[1]*100+arr[2]*10+arr[3])+(1000+arr[4]*100+arr[5]*10+arr[1])==10000+arr[4]*1000+arr[2]*100+arr[1]*10+arr[6]) {
                System.out.println(1000+arr[4]*100+arr[5]*10+arr[1]);
                flag=1;
            }
            return;
        }
        int i=0;
        for(i=num;i<=8;i++) {
            Swap(i,num);
            Quan(num+1);
            if(flag==1) {
                return;
            }
            Swap(i,num);
        }
    }
    public static void main(String args[]) {
        Quan(0);
    }
}

答案:1085

22:07:35

2018-06-08