我同学给了我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)
总结:
这个用递归的思路很简单,可能用循环更节省内存。当然大家如果有更简单的方法,希望你告诉我。
本文介绍了如何使用C语言解决一个数学问题:寻找满足ABCD*E=DCBA条件的数字组合。通过递归搜索数字组合,并判断是否满足等式,最终找到了例如2178*4=8712这样的解。作者欢迎读者分享更简便、高效的方法。
1867

被折叠的 条评论
为什么被折叠?



