回 帖 发 新 帖 刷新版面

主题:入门习题第一题解答

题目:
1.  给定等式    A B C D E     其中每个字母代表一个数字,且不同数字对应不
                    D F G     同字母。编程求出这些数字并且打出这个数字的
             +      D F G     算术计算竖式。

             ───────

                X Y Z D E



我比较笨,想不出什么好算法,只好暴力.....


[code=c]
#include <iostream>
#include <strstream>

using namespace std;

int number_ok(int i)
{
    char s;
    char *s_p;
    char *str_i;

    str_i = new char[10];
    str_i[0] = '\0';

    ostrstream outs(str_i,10);
    outs << i << ends;

    while(*str_i)
    {
        s_p=str_i;
        s=*s_p;

        while(*s_p)
        {
            s_p++;
            if (s==*s_p)
            {
                delete str_i;
                return 0;
            }
        }

        str_i++;
    }

    delete str_i;
    return 1;
}


int main()
{
        int i,j,k;
        char i_str[10];
        char j_str[10];
        char k_str[10];
        char *str_temp;

        for (i = 12354; i <= 98754; i++)
            if(number_ok(i))
            for (j = 150; j <= 950; j+=100)
                if(number_ok(j))
                {
                    k=i+j+j;

                    if(number_ok(k))
                    {
                        i_str[0]='\0';
                        ostrstream outs_i(i_str,10);
                        outs_i << i <<ends;

                        j_str[0]='\0';
                        ostrstream outs_j(j_str,10);
                        outs_j << j <<ends;

                        k_str[0]='\0';
                        ostrstream outs_k(k_str,10);
                        outs_k << k <<ends;


                        if(j_str[0] != i_str[3])  goto next;    //j[0]==i[3]
                        if(i_str[3] != k_str[3])  goto next;    //i[3]==k[3]
                        if(i_str[4] != k_str[4])  goto next;    //i[4]==k[4]

                        str_temp=i_str;                         //j[1][2] noin i
                        while(*str_temp)
                            {
                                if(j_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=i_str;
                        while(*str_temp)
                            {
                                if(j_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=k_str;                           //j[1][2] noin k
                        while(*str_temp)
                            {
                                if(j_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=k_str;
                        while(*str_temp)
                            {
                                if(j_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=k_str;                             //i[0][1][2] noin k
                        while(*str_temp)
                            {
                                if(i_str[0]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=k_str;
                        while(*str_temp)
                            {
                                if(i_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=k_str;
                        while(*str_temp)
                            {
                                if(i_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=i_str;                             //k[0][1][2] noin i
                        while(*str_temp)
                            {
                                if(k_str[0]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=i_str;
                        while(*str_temp)
                            {
                                if(k_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=i_str;
                        while(*str_temp)
                            {
                                if(k_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=j_str;                             //i[0][1][2] noin j
                        while(*str_temp)
                            {
                                if(i_str[0]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=j_str;
                        while(*str_temp)
                            {
                                if(i_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=j_str;
                        while(*str_temp)
                            {
                                if(i_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=j_str;                             //k[0][1][2] noin j
                        while(*str_temp)
                            {
                                if(k_str[0]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=j_str;
                        while(*str_temp)
                            {
                                if(k_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=j_str;
                        while(*str_temp)
                            {
                                if(k_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        str_temp=i_str;                             //j[1][2] noin i k
                        while(*str_temp)
                            {
                                if(j_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=i_str;
                        while(*str_temp)
                            {
                                if(j_str[2]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=k_str;
                        while(*str_temp)
                            {
                                if(j_str[1]==*str_temp) goto next;
                                str_temp++;
                            }
                        str_temp=k_str;
                        while(*str_temp)
                            {
                                if(j_str[2]==*str_temp) goto next;
                                str_temp++;
                            }

                        cout << endl;
                        cout << " " << "ABCDE" << endl
                             << "   " << "DFG" << endl
                             << "+  " << "DFG" << endl
                             << "======="      << endl
                             << " " << "XYZDE" << endl << endl

                             << " "   << i << endl
                             << "   " << j << endl
                             << "+  " << j << endl
                             << "======="  << endl
                             << " "   << k << endl;

                        next: ;
                    }
                }

    return 0;
}


[/code]


GCC下编译通过。
结果:


 ABCDE
   DFG
+  DFG
=======
 XYZDE

 29786
   850
+  850
=======
 31486

回复列表 (共6个回复)

沙发


BB看在半夜做题的份上给点辛苦分。[em8]

板凳

汗……做入门习题早就没分了……而且发帖是不能评分的,能评分的是发帖人给回帖人
另:
你的暴力法也太囧了吧……直接整个数上来……这问题一般都是先数学分析原题求化简,然后缩小范围之后直接循环各个数字的
比如说,G+G+E的个位还是E,G只能是0或5,又由D+F+F个位=D知道G=0,F=5。原因不用多解释了吧。A加上进位=X那么必然有X=A+1
而B得到的最大进位不可能超过2(就算倒数第二位是3个9,算上最多2的进位也只有29。不够3)所以B为8或者9由于0已经有了,所以Y不是0,因此B只能是9(因为要进位),Y随之只能是1
现在问题就只剩下C D E Z A X了。又有C+D+D+进位1>20的隐形已知的约束,由于百位得到进位1,D不能是9,D只能是6,7或者8。利用上述化简后的已知求解即可

3 楼

的确是的,这题不具有普遍性,手动比遍程来的快。

4 楼

[quote]的确是的,这题不具有普遍性,手动比遍程来的快。[/quote]
几乎所有常见的穷举都能进行简单优化的。建议你有空去qb区玩玩,那里我看到一个优化思路一重循环解百钱百鸡的代码,主要是看优化思路的程度了

5 楼

[quote][quote]的确是的,这题不具有普遍性,手动比遍程来的快。[/quote]
几乎所有常见的穷举都能进行简单优化的。建议你有空去qb区玩玩,那里我看到一个优化思路一重循环解百钱百鸡的代码,主要是看优化思路的程度了[/quote]

嗯,好的,加强学习在。

6 楼

太暴力了!!!!!!!!!!!!!!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册