神奇算式

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成

比如:

210*6=1260

8*473=3764

27*81=2187都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足?

#include <stdio.h>
int issame(int a,int b,int c ,int d)
{
    if(a == b || a == c || a == d)
        return 1;
    if(b == c || b == d || c == d) 
        return 1;
    return 0;
}
int isdivided(int t,int a,int b,int c,int d)
{
    int a1,b1,c1,d1;
    int mark = 0;
    //取位数 
    a1 = t%10;
    t /= 10;
    b1 = t%10;
    t /= 10;
    c1 = t%10;
    d1 = t/10;
    if(!issame(a1,b1,c1,d1))
    {
        if(a1 == a || a1 == b || a1 == c || a1 == d)
            mark ++;
        if(b1 == a || b1 == b || b1 == c || b1 == d)
            mark ++;
        if(c1 == a || c1 == b || c1 == c || c1 == d)
            mark ++;
        if(d1 == a || d1 == b || d1 == c || d1 == d)
            mark ++;
        if(mark == 4)
            return 1;
    }
    return 0;
}
int main()
{
    int count = 0;
    int a,b,c,d,t;
    //a*bcd型 
    for(a=2;a<=9;a++)
        for(b=1;b<=9;b++)
            for(c=0;c<=9;c++)
                for(d=0;d<=9;d++)
                {
                    if(!issame(a,b,c,d))//4个数字各不相同 
                    {
                        t = a*(100*b+10*c+d);
                        if(t/1000 > 0 && isdivided(t,a,b,c,d))//首先要是4位数,判断乘积 是否由这4个数字组成 
                        {
                            printf("%d*%d=%d\n",a,t/a,t) ;
                            count ++;
                        }
                    }
                }
    //ab*cd型(ab<cd)
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)//27 * 81 = 2187
            for(c=2;c<=9;c++)//此处判断语句不可写为:c > a && c <=9否则a自加1后,因不满足条件而跳出循环,导致最终的a=1999就停止搜索 
                for(d=0;d<=9;d++)
                {
                    //printf("find%d%d%d%d\n",a,b,c,d);
                    if(c > a && !issame(a,b,c,d)) //c>a应该写在此处 
                    {
                        t = (10*a + b)*(10*c + d);
                        if(t/1000 > 0 && isdivided(t,a,b,c,d))
                        {
                            printf("%d*%d=%d\n",10*a+b,10*c+d,t);
                            count ++;
                        }
                    }
                }
    printf("共计:%d\n",count);
    return 0;
}

posted @ 2016-03-16 22:44  我在这儿  阅读(174)  评论(0)    收藏  举报