multiplication puzzle

本文介绍了一个在Emacs环境中运行的文字游戏算法解决方案。该游戏要求玩家解析由大写字母组成的数学乘法问题,并找出每个字母所代表的数字。通过枚举三位数与两位数的所有可能组合,该算法能够验证每种组合是否符合给定的乘法算式的结构特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这是emacs中的一个小游戏:给一个用大写字母表示的乘法算式,计算出每个大写字母代表的数字。例如,以下的乘法竖式:
     B I D
    x  D J
   -------
   A B H D
H J I D
 ---------
 H D A I D
    
在这个式子中, BID = 475DJ = 53ABHD = 1425HJID = 2375HDAID = 25175。现在写一个程序,根据给定的算式计算每一个大写字母代表的数字。因为在emacs的这个小游戏中,所有算式都有相同的特点:被乘数3位数,乘数2位数,中间结果都是4位数,最终结果都是5位数。所以,专门针对emacs的小游戏的这个程序的一个非常简单的思路就是:枚举所有三位数和两位数相乘的式子,检测它们是否与给定的字母表示相容,如果有冲突,继续枚举下一个式子,否则就找到了解。如何判断找到的式子是否与给定的字母表示相容呢?假设A, B是任意两个字母表示,a,b是枚举出来的与A,B对应的数字值。不相容有两种情况:A==Ba!=b,或者A!=Ba==b,即flag = (A == B && a != b) || (A != B && a == b),当flag1时,表示有冲突。从flag的表达式很容易能看出flag的表达式可以简写为:flag = (A == B) ^ (a == b)下面是源代码:
#include <stdio.h>
#include <string.h>
 
#define print(cnt, format, array) for(i = 0; i < cnt; i++) printf(format, *(array+i))
 
int main() {
    int op1, op2, a, b;
    char all[32], temp[32];
    int i, j, flag;
 
    *all = 0;
    puts("input op1:"); scanf("%s", all + strlen(all));
    puts("input op2:"); scanf("%s", all + strlen(all));
    puts("input median result and final result line by line:");
    scanf("%s", all + strlen(all));  /* get first median resutl */
    scanf("%s", all + strlen(all));  /* get second median resutl */
    scanf("%s", all + strlen(all));  /* get final result */
 
 
    for(op1 = 100; op1 <= 999; op1++) {
    for(op2 = 10; op2 <= 99; op2++) {
        a = op2 % 10;
        b = op2 / 10;
        if(op1 * a < 1000 || op1 * b < 1000) continue;
 
        memset(temp, 0, sizeof(temp));
        sprintf(temp, "%d%d%d%d%d", op1, op2, op1 * a, op1 * b, op1 * op2);
 
 
        flag = 1;
        if(strlen(all) != strlen(temp)) { flag = 0; break; }
        for(i = 0; i < strlen(all); i++) {
        for(j = 0; j < i; j++) {
            if((all[i] == all[j]) ^ (temp[i] == temp[j])) {
            flag = 0; break;
            }
        }
        if(flag == 0) break;
        }
 
        if(flag) {
        print(3, "%c", all); printf(" = "); print(3, "%c", temp); printf("/n");
        print(2, "%c", all + 3); printf(" = ");print(2, "%c", temp + 3); printf("/n");
        print(4, "%c", all + 5); printf(" = ");print(4, "%c", temp + 5); printf("/n");
        print(4, "%c", all + 9); printf(" = ");print(4, "%c", temp + 9); printf("/n");
        printf("%s = %s/n", all + 13, temp + 13);
        return 0;
        }
    }
    }
    return 0;
}
                 例如对一开始的例子运行,输入:
 
BID
DJ
ABHD
HJID
HDAID
程序就会输出结果:
BID = 475
DJ = 53
ABHD = 1425
HJID = 2375
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值