multiplication puzzle

 

这是 emacs 中的一个小游戏:给一个用大写字母表示的乘法算式,计算出每个大写字母代表的数字。例如,以下的乘法竖式:
     B I D
    x  D J
   -------
   A B H D
H J I D
 ---------
 H D A I D
    
在这个式子中, BID = 475 DJ = 53 ABHD = 1425 HJID = 2375 HDAID = 25175 。现在写一个程序,根据给定的算式计算每一个大写字母代表的数字。 因为在 emacs 的这个小游戏中,所有算式都有相同的特点:被乘数 3 位数,乘数 2 位数,中间结果都是 4 位数,最终结果都是 5 位数。所以,专门针对 emacs 的小游戏的这个程序的一个非常简单的思路就是:枚举所有三位数和两位数相乘的式子,检测它们是否与给定的字母表示相容,如果有冲突,继续枚举下一个式子,否则就找到了解。 如何判断找到的式子是否与给定的字母表示相容呢?假设 A, B 是任意两个字母表示, a,b 是枚举出来的与 A,B 对应的数字值。不相容有两种情况: A==B a!=b ,或者 A!=B a==b ,即 flag = (A == B && a != b) || (A != B && a == b) ,当 flag 1 时,表示有冲突。从 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值