Programming 版 (精华区)

发信人: zjliu (fly), 信区: Programming
标  题: 算24的小程序(转载)
发信站: 哈工大紫丁香 (2001年12月21日08:08:58 星期五), 转信

【 以下文字转载自 Work 讨论区 】
【 原文由 jiaxuan 所发表 】


上面的两个方法实现起来都有些困难,下面这个小程序作了一个总结,
但不能通用变个数算24的方法。

#include "string.h"
#include "float.h"
#include "stdio.h"

float Oper(float a, float b, char *sa, char *sb, char *sr, int i);
void main(void)
{
short iOrgData[12][4]={{8,8,3,3},...};
/* 4个数做排列,自己手工排一下吧。编个程序怪烦的,注意无需做全排列,
第一个数与第二个数的位置无需交换 */
int i, j, k, l, num;
short *iSeqData;
char cOperStr1[100], cOperStr2[100], cOperRes1[10], cOperRes2[20], cOperRes3[
40];
float iMedRes[3]={0,0,0};


for(i = 0; i < 12; i++)
{
iSeqData = iOrgData[i];
/* 先用来算形如 (a+b)*(c+d), a*b+c*d的结果 */
for(j = 0; j < 6; j++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%d", iSeqData[0]);
sprintf(cOperStr2, "%d", iSeqData[1]);
memset(cOperRes1, 0, 10);
iMedRes[0] = Oper(iSeqData[0], iSeqData[1], cOperStr1, cOperStr2, cOperRes1
, j);
if(memcmp(cOperRes1, "err", 3) == 0)
continue;

for(k = 0; k < 3; k++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%d", iSeqData[2]);
sprintf(cOperStr2, "%d", iSeqData[3]);
memset(cOperRes2, 0, 20);
iMedRes[1] = Oper(iSeqData[2], iSeqData[3], cOperStr1, cOperStr2, cOperRes
2, j < 3 ? k : k + 3);
if(memcmp(cOperRes2, "err", 3) == 0)
continue;

for(l = 0; l < 3; l++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%s", cOperRes1);
sprintf(cOperStr2, "%s", cOperRes2);
memset(cOperRes3, 0, 40);
iMedRes[2] = Oper(iMedRes[0], iMedRes[1], cOperStr1, cOperStr2, cOperRes3
, j < 3 ? l + 3 : l);
if(memcmp(cOperRes3, "err", 3) == 0)
continue;
if(iMedRes[2] - 24 == 0 ||
iMedRes[2] - 24 > 0 && iMedRes[2] - 24 < 0.001 ||
iMedRes[2] - 24 < 0 && iMedRes[2] - 24 > -0.001)
{
printf("%s = 24", cOperRes3);
}
}
}
}

for(j = 0; j < 6; j++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%d", iSeqData[0]);
sprintf(cOperStr2, "%d", iSeqData[1]);
memset(cOperRes1, 0, 10);
iMedRes[0] = Oper(iSeqData[0], iSeqData[1], cOperStr1, cOperStr2, cOperRes1
, j);
if(memcmp(cOperRes1, "err", 3) == 0)
continue;

for(k = 0; k < 6; k++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%s", cOperRes1);
sprintf(cOperStr2, "%d", iSeqData[2]);
memset(cOperRes2, 0, 20);
iMedRes[1] = Oper(iMedRes[0], iSeqData[2], cOperStr1, cOperStr2, cOperRes2
, k);
if(memcmp(cOperRes2, "err", 3) == 0)
continue;

for(l = 0; l < 6; l++)
{
memset(cOperStr1, 0, 100);
memset(cOperStr2, 0, 100);
sprintf(cOperStr1, "%s", cOperRes2);
sprintf(cOperStr2, "%d", iSeqData[3]);
memset(cOperRes3, 0, 40);
iMedRes[2] = Oper(iMedRes[1], iSeqData[3], cOperStr1, cOperStr2, cOperRes
3, l);
if(memcmp(cOperRes3, "err", 3) == 0)
continue;
if(iMedRes[2] - 24 == 0 ||
iMedRes[2] - 24 > 0 && iMedRes[2] - 24 < 0.001 ||
iMedRes[2] - 24 < 0 && iMedRes[2] - 24 > -0.001)
{
printf("%s = 24", cOperRes3);
}
}
}
}
}

}

float Oper(float a, float b, char *sa, char *sb, char *sr, int i)
{
switch(i)
{
case 0:
sprintf(sr, "(%s + %s)", sa, sb);
return (a+b);
case 1:
sprintf(sr, "(%s - %s)", sa, sb);
return (a-b);
case 2:
sprintf(sr, "(%s - %s)", sb, sa);
return (b-a);
case 3:
sprintf(sr, "(%s * %s)", sa, sb);
return (a*b);
case 4:
if(b!=0)
{ sprintf(sr, "(%s / %s)", sa, sb);
return (a/b);
}
else
{
sprintf(sr, "err");
return 0;
}
case 5:
if(a!=0)
{
sprintf(sr, "(%s / %s)", sb, sa);
return (b/a);
}
else
{
sprintf(sr, "err");
return 0;
}
}
}



--

※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 218.2.150.6]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: 202.118.229.86]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.441毫秒