C语言实现之ABCDxE=DCBA

本文介绍了如何使用C语言解决一个数学问题:寻找满足ABCD*E=DCBA条件的数字组合。通过递归搜索数字组合,并判断是否满足等式,最终找到了例如2178*4=8712这样的解。作者欢迎读者分享更简便、高效的方法。

我同学给了我3个题目,写完了,分3篇文章发出来。

*写的比较仓促,如果有更简便、执行效率更高的方法还请不吝赐教,当然我的如果有问题请大家给指出。

题目:

        有一个数学等式:ABCD*E=DCBA,式中的一个字母代表一位数字,试找出所有符合上述要求的乘积式并打印输出。

分析:

   此问题就是搜索数字的组合中满足此运算的组合,有一点就是这里没说清楚这几个符号代表的数字是否可以重复,我个人是按不可以重复处理的。

思路:

    我是这样想的,建立一个数组,存储搜索出来的数字组合,然后再判断是否满足ABCD*E=DCBA条件,满足的话就输出。

实现:

#include <stdio.h>

int numArr[4];   //存储元素排列的数组

/*********************************************
*函  数:BOOL judge(int site, int num)        *
*参  数:当前位置, 待判断数字                   *
*功  能:判断当前数字是否和之前数字有重复          *
*返  回:无重复返回1,有重复0                    *
**********************************************/
int judge(int site, int num)
{
    while(site--)
    {
        if(numArr[site] == num)
        {
            return 0;
        }
    }
    return 1;
}


/**************************
*函  数:void opt()        *
*参  数:无                *
*功  能:输出可行组合       *
*返  回:无                *
***************************/
void opt()
{
    int loop = 10;                                                                                      //E
    int numMul = numArr[0] * 1000 + numArr[1] * 100 + numArr[2] * 10 + numArr[3];                       //组合被乘数
    int numiMul = numArr[3] * 1000 + numArr[2] * 100 + numArr[1] * 10 + numArr[0];                      //组合结果

    while(loop--)
    {
        //判断是否满足条件然后输出
        if(judge(4, loop) && (numMul * loop == numiMul))
        {
            printf("A=%d, B=%d, C=%d, D=%d, E=%d\n", numArr[0],numArr[1], numArr[2], numArr[3], loop);
        }
    }
}


/***************************************
*函  数:void trvl(int site)            *
*参  数:当前遍历的数字的位置              *
*功  能:递归组合所有可能                 *
*返  回:无                             *
****************************************/
void trvl(int site)
{
    int num = -1;

    if(site == 4)
    {
        opt();                      //输出可行组合
        return;
    }

    while(++num < 10)
    {
        //判断此数字是否满足不重复条件
        if(judge(site, num))
        {
            numArr[site] = num;     //存储满足条件的数字到当前位置上
            trvl(site + 1);         //搜索下一个数字
        }
    }
}


/**********************
*函  数:int main()    *
*参  数:无            *
*功  能:主函数         *
*返  回:0             *
***********************/
int main()
{
    trvl(0);        //遍历所有组合
    return 0;       //返回0
}

结果:

A=2, B=1, C=7, D=8, E=4

(2178 x 4 = 8712)

总结:

       这个用递归的思路很简单,可能用循环更节省内存。当然大家如果有更简单的方法,希望你告诉我。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值