求这样的两位数:5位数=2*4位数(9位数字各不相同)

解法一:枚举法(暴力穷举)

#include<stdio.h>
int main()
{
    int  c, d, e, f, g, h, i, j, k,  n2, n3;
     for (c = 1; c < 10; c++)
            {
                for (d = 0; d < 10; d++)
                {
                    for (e = 0; e < 10; e++)
                    {
                        for (f = 0; f < 10; f++)
                        {
                            for (g = 1; g < 10; g++)
                            {
                                for (h = 0; h < 10; h++)
                                {
                                    for (i = 0; i < 10; i++)
                                    {
                                        for (j = 0; j < 10; j++)
                                        {
                                            for (k = 0; k < 10; k++)
                                            {
                                                n2 = 1000 * c + 100 * d + 10 * e + f;
                                                n3 = 10000 * g + 1000 * h + 100 * i + 10 * j + k;
                                                    if(c != d && c != e && c != f && c != g && c != h && c != i && c != j && c != k
                                                    && d != e && d != f && d != g && d != h && d != i && d != j && d != k
                                                    && e != f && e != g && e != h && e != i && e != j && e != k
                                                    && f != g && f != h && f != i && f != j && f != k
                                                    && g != h && g != i && g != j && g != k
                                                    && h != i && h != j && h != k
                                                    && i != j && i != k
                                                    && j != k && n3 == 2 * n2)
                                                {
                                                    printf("      2\n");
                                                    printf("*  %d%d%d%d\n", c, d, e, f);
                                                    printf("---------\n");
                                                    printf("  %d%d%d%d%d\n\n", g, h, i, j, k);
                                                }
                                            }
                                        }
                                    }
                                }
                    }
                }
            }
        }
    }
    return 0;
}

解法二:调用子函数判断各位数是否相同

#include<stdio.h>
int pd(int e,int f)
{
    int a[4] = { -1 },g[5] = { -1 };
    int i = 0,t=0,k;
    while (e)
    {
        a[i++] = e % 10;
        for (k = 0; k < i; k++)
        {
            if (a[i-1] == a[k]&&i-1!=k)
            {
                return 0;
            }
        }
        e=e / 10;
    }
    while (f)
    {
        g[t++] = f % 10;
        for (k = 0; k < t; k++)
        {
            if (g[t - 1] == g[k] && t - 1 != k)
            {
                return 0;
            }
        }
        for (k = 0; k < 4; k++)
        {
            if (g[t - 1] == a[k])
            {
                return 0;
            }
        }
        f = f/ 10;
    }
    return 1;
}
int main()
{
    int b, c,d;
        for (b= 10000; b < 100000;b++)
        {
            for (c = 1000; c < 10000; c++)
            {
                d = 2 * c;
                if (pd(c, b) && d == b)
                {
                    printf("  2\n");
                    printf("* %d\n", c);
                    printf("---------\n");
                    printf(" %d\n", b);
                }
            }
        }
    return 0;
}

解法三:数组做标记判断是否被使用

数组做标志位的详解可借鉴上一篇笔记

#include<stdio.h>
int pd(int a, int b)
{
    int c[10] = { 0 };
    int i;
    while (a)
    {
        c[a % 10]++;
        a = a / 10;
    }
    while (b)
    {
        c[b % 10]++;
        b = b / 10;
    }
    for (i = 0; i < 10; i++)
    {
        if (c[i] > 1)
            return 0;
    }
    return 1;
}
int main()
{
    int n, m,t=0;
    for (n = 10000; n < 100000; n++)
    {
        for (m = 1000; m < 10000; m++)
        {
            if ((2 * m == n) && pd(n, m))
            {
                t++;
                printf("算式%d\t2*%d=%d\n\n",t,m,n);
            }
        }
    }
    return 0;
}

解法四:回溯递归法

回溯递归就是还是利用数组给全部赋值0;然后两个数分别去在数组取下标,如果数组值为0代表可取,然后一次取一个数,然后一直递归取完数符合条件输出一个,然后再回去,再进行取数,一直到取完所有情况,不符合的时候再返回递归的上一次。

发布了28 篇原创文章 · 获赞 13 · 访问量 467

猜你喜欢

转载自blog.csdn.net/yo_u_niverse/article/details/105255064