帮忙解决这题

rossi789 2004-11-20 10:11:54
已知条件:用1,2,3,4,5,6,7,8,9 这九个数字填充以下等式,并且在每等式全部用上这九个数字,每个数字不能重复。
□□×□□□=□□□□
共有7个答案,举个例子:
12×483=5796
编程找出其他的答案.
...全文
143 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rossi789 2004-11-21
  • 打赏
  • 举报
回复
Leaveye:
能说说你的算法吗
marszheng 2004-11-21
  • 打赏
  • 举报
回复
楼上这位好强啊???可以交个朋友吗
我的qq:287147309
Leaveye 2004-11-21
  • 打赏
  • 举报
回复
输出:

42 * 138 = 5796
28 * 157 = 4396
48 * 159 = 7632
39 * 186 = 7254
27 * 198 = 5346
18 * 297 = 5346
12 * 483 = 5796
91 * 768 = 4352
75 * 892 = 1364
Leaveye 2004-11-21
  • 打赏
  • 举报
回复
/*
已知条件:用1,2,3,4,5,6,7,8,9 这九个数字填充以下等式,并且在每等
式全部用上这九个数字,每个数字不能重复。
□□×□□□=□□□□
共有7个答案,举个例子:
12×483=5796
编程找出其他的答案.
*/


#define Masked(m) (UsedMask & (m))
#define AddMask(m) (UsedMask |= (m))
#define DelMask(m) (UsedMask &= ~(m))

#define IsUsed(n) Masked(MaskOf[n])
#define Use(n) AddMask(MaskOf[n])
#define UnUse(n) DelMask(MaskOf[n])

#define Inc(n) while(IsUsed(n) && (n) < 10) ++(n)


void main(void)
{
unsigned int UsedMask = 0x0001;
unsigned int CellMask[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

const int MaskOf[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 };

unsigned int Multiplicand, Multiplicator, Product, tmp;

printf("\n");

for(
Multiplicator = 100, CellMask[5] = 2, CellMask[4] = CellMask[3] = 1;
Multiplicator < 1000;
++Multiplicator,
CellMask[5] = MaskOf[Multiplicator / 100],
CellMask[4] = MaskOf[Multiplicator / 10 % 10],
CellMask[3] = MaskOf[Multiplicator % 10]
) {
if( CellMask[5] & CellMask[4] || CellMask[5] & CellMask[3]
|| CellMask[4] & CellMask[3]
|| Masked(CellMask[5] | CellMask[4] | CellMask[3])
) continue;
AddMask(CellMask[5] | CellMask[4] | CellMask[3]);
for(
Multiplicand = 10, CellMask[2] = 2, CellMask[1] = 1;
Multiplicand < 100;
++Multiplicand, CellMask[2] = MaskOf[Multiplicand / 10],
CellMask[1] = MaskOf[Multiplicand % 10]
) {
Product = Multiplicand * Multiplicator;
if( CellMask[2] & CellMask[1] || Product > 9999
|| Masked(CellMask[2] | CellMask[1])
) continue;
AddMask(CellMask[2] | CellMask[1]);
CellMask[6] = MaskOf[Product % 10];
CellMask[7] = MaskOf[(Product /= 10) % 10];
CellMask[8] = MaskOf[(Product /= 10) % 10];
CellMask[9] = MaskOf[Product / 10];
tmp = 0;
Product = CellMask[6] | CellMask[7] | CellMask[8] | CellMask[9];
while(Product > 0)
(Product & 1)? ++tmp: 0, Product >>= 1;
Product = Multiplicand * Multiplicator;
tmp = (4 == tmp) && ! Masked(
CellMask[6] | CellMask[7] | CellMask[8] | CellMask[9]
);
if(tmp) {
printf("%d * %d = %d\n", Multiplicand, Multiplicator, Product);
}
DelMask(CellMask[2] | CellMask[1]);
}
DelMask(CellMask[5] | CellMask[4] | CellMask[3]);
}
}
a252169322 2004-11-21
  • 打赏
  • 举报
回复
用穷举!
Squall1009 2004-11-21
  • 打赏
  • 举报
回复
可以先从每个数的最后的一位填
hillman004 2004-11-21
  • 打赏
  • 举报
回复
这是一个全排列的问题,之后判断一下就行了
看一下算法分析书,肯定会有的
Leaveye 2004-11-21
  • 打赏
  • 举报
回复

/*
已知条件:用1,2,3,4,5,6,7,8,9 这九个数字填充以下等式,并且在每等
式全部用上这九个数字,每个数字不能重复。
□□×□□□=□□□□
共有7个答案,举个例子:
12×483=5796
编程找出其他的答案.
*/

unsigned int UsedMask = 0x0001; // 这个对象移到外边比较好理解
// 这是一个整体标记对象,按位标记
// 在用为1,未用为0
// 该对象记录当前所使用的数字,初值为已使用0

// 对该整体标记的操作接口(面对标记)
#define Masked(m) (UsedMask & (m)) // 判断标记 m 是否已经设定在整体标记里
#define AddMask(m) (UsedMask |= (m)) // 将标记 m 追加进整体标记
#define DelMask(m) (UsedMask &= ~(m)) // 从整体标记中移除标记 m

// 对该整体标记的操作接口(面对数字)
#define IsUsed(n) Masked(MaskOf[n]) // 在整体标记中判断数字 n 是否已经使用
#define Use(n) AddMask(MaskOf[n]) // 在整体标记中标记数字 n 已经使用
#define UnUse(n) DelMask(MaskOf[n]) // 从整体标记中标记数字 n 尚未使用

#define Inc(n) while(IsUsed(n) && (n) < 10) ++(n) // 没用,忘删了


void main(void)
{
unsigned int CellMask[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
// 九个位置,分别编号 C2 C1 * C5 C4 C3 = C9 C8 C7 C6

const int MaskOf[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 };
// 各数字对应的标记,为提高效率,写为一维表

unsigned int Multiplicand, Multiplicator, Product, tmp;
// 被乘数、乘数、积 以及 临时变量

printf("\n");

// 用整型搜索数字(被乘数、乘数),乘数的循环次数多,放在外层
// 找乘数
for(
Multiplicator = 100, CellMask[5] = 2, CellMask[4] = CellMask[3] = 1;
Multiplicator < 1000;
++Multiplicator,
CellMask[5] = MaskOf[Multiplicator / 100],
CellMask[4] = MaskOf[Multiplicator / 10 % 10],
CellMask[3] = MaskOf[Multiplicator % 10]
) { // 被乘数循环
// 对于每一个被测试的乘数,分析其使用的数字,记录标记
if( CellMask[5] & CellMask[4] || CellMask[5] & CellMask[3]
|| CellMask[4] & CellMask[3]
|| Masked(CellMask[5] | CellMask[4] | CellMask[3])
) continue; // 不可用,找下一个

// 找到一个可用乘数

AddMask(CellMask[5] | CellMask[4] | CellMask[3]); // 设置数字为已用

// 找被乘数
for(
Multiplicand = 10, CellMask[2] = 2, CellMask[1] = 1;
Multiplicand < 100;
++Multiplicand, CellMask[2] = MaskOf[Multiplicand / 10],
CellMask[1] = MaskOf[Multiplicand % 10]
) { // 被乘数循环
// 对于每一个被测试的被乘数,分析其使用的数字,记录标记
Product = Multiplicand * Multiplicator;
if( CellMask[2] & CellMask[1] || Product > 9999
|| Masked(CellMask[2] | CellMask[1])
) continue; // 不可用,找下一个

// 找到一个可用被乘数

AddMask(CellMask[2] | CellMask[1]); // 设置数字为已用

CellMask[6] = MaskOf[Product % 10];
CellMask[7] = MaskOf[(Product /= 10) % 10];
CellMask[8] = MaskOf[(Product /= 10) % 10];
CellMask[9] = MaskOf[Product / 10];

tmp = 0;
Product = CellMask[6] | CellMask[7] | CellMask[8] | CellMask[9];
while(Product > 0)
(Product & 1)? ++tmp: 0, Product >>= 1;
Product = Multiplicand * Multiplicator;

tmp = (4 == tmp) && ! Masked(
CellMask[6] | CellMask[7] | CellMask[8] | CellMask[9]
); // 判断积是否可用的表达式
if(tmp) {
printf("%d * %d = %d\n", Multiplicand, Multiplicator, Product);
}

// 分析该被乘数完成
DelMask(CellMask[2] | CellMask[1]); // 设置数字为未用
}

// 分析该乘数完成
DelMask(CellMask[5] | CellMask[4] | CellMask[3]); // 设置数字为未用
}
}

Flood1984 2004-11-20
  • 打赏
  • 举报
回复
穷举!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧