一、项目背景

近日在观看某短视频软件时,发现某些用户直播移动火柴游戏,笔者有时会很快找出方法,有时却毫无头绪,如5+7=9,怀疑无解,故以此编程。

二、编程环境

笔者用的是 Visual Studio 2019,基于标准库编程。

三、规则介绍

题目给出一个十位数以内的自然数加减算式,三个数都为0-9可用火柴表示的单个数字,如:

其中+-为:

题目要求为移动一根火柴使原错误等式成立,如6-6=3,即可移动6上一根火柴,使6变为9,满足题意。

要求输入一个等式,输出满足题意的所有等式,若无,则输出无解。

四、思路解析

1、缺余量和移动数:

(1)定义;

由于游戏中,三个数字和运算符号也可以移动,所以考察当将数字i变为j时,针对这个数字,火柴变动的最少个数即为移动数,而变动后所多余或所缺失的火柴数目为缺余量,定义正数为多余量,负数为缺失量。

如:数字3变为数字9,至少需要移动1根火柴,而这一根火柴数字3没有,缺一根,故由3到9的变化中,移动数为1,缺余量为-1。

(2)数字火柴编码;

为了计算缺余量和移动数,笔者将火柴数字图中七个火柴位置编码,由低位到高位如图,得到了从数字0到数字9的二进制数组:

int Num[10] = { 126,48,109,121,51,91,95,112,127,123 };

例如0,即为0b1111110,十进制为126。所以Num[i]就是数字i的火柴编码数。

(3)计算;

i变为j

缺失量=组成数字i的火柴数 - 组成数字j的火柴数。

data[i][j].suls = NumOfOne(Num[i]) - NumOfOne(Num[j]);

移动数=组成i,j火柴数较大的那个 - i,j公共火柴部分。

data[i][j].move = data[i][j].suls >= 0 ? (NumOfOne(Num[i]) - NumOfOne(Num[i] & Num[j])) : (NumOfOne(Num[j]) - NumOfOne(Num[i] & Num[j]));

其中NumOfOne()函数定义如下:

int NumOfOne(int n)
{int cnt;for (cnt = 0; n; cnt++)n = n & (n - 1);return cnt;
}

2、计算改变自身的移动数和多余量的和即为移动木柴数

此处做了算法的延伸,可解决移动多根火柴的问题。

bool Flag(num num1, num num2, num num3, num sym, int n) {//计算改变自身的移动数和多余量的和即为移动木柴数bool a = num1.suls + num2.suls + num3.suls + sym.suls == 0;num s[4] = { num1,num2,num3,sym };int sum = 0;for (int i = 0; i < 4; i++)if (s[i].suls >= 0)sum += s[i].move;elsesum += s[i].move+s[i].suls;return a && (sum == n);
}

3、遍历计算

void cul(char* ch) {for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++)for (int k = 0; k < 10; k++)for (int l = 0; l < 2; l++)if (Flag(data[ch[0] - '0'][i], data[ch[2] - '0'][j], data[ch[4] - '0'][k], sym[(ch[1] / 2 - 21) * 2 + l], 1))if ((l && (i - j == k)) || ((!l) && (i + j == k)))printf("%d %c %d = %d\n", i, 43 + 2 * l, j, k);
}

五、代码

#include <iostream>
int Num[10] = { 126,48,109,121,51,91,95,112,127,123 };
struct num {int suls;int move;
}data[10][10], sym[4] = { {0,0},{1,1},{-1,1},{0,0} };
int NumOfOne(int n)
{int cnt;for (cnt = 0; n; cnt++)n = n & (n - 1);return cnt;
}
bool IfNumber(char ch) {return ch >= '0' && ch <= '9';
}
bool Flag(num num1, num num2, num num3, num sym, int n) {//计算改变自身的移动数和多余量的和即为移动木柴数bool a = num1.suls + num2.suls + num3.suls + sym.suls == 0;num s[4] = { num1,num2,num3,sym };int sum = 0;for (int i = 0; i < 4; i++)if (s[i].suls >= 0)sum += s[i].move;elsesum += s[i].move+s[i].suls;return a && (sum == n);
}
void cul(char* ch) {for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++)for (int k = 0; k < 10; k++)for (int l = 0; l < 2; l++)if (Flag(data[ch[0] - '0'][i], data[ch[2] - '0'][j], data[ch[4] - '0'][k], sym[(ch[1] / 2 - 21) * 2 + l], 1))if ((l && (i - j == k)) || ((!l) && (i + j == k)))printf("%d %c %d = %d\n", i, 43 + 2 * l, j, k);
}
int main()
{char ch[10] = { 0 };for (int i = 0; i < 10; i++)for (int j = 0; j < 10; j++){data[i][j].suls = NumOfOne(Num[i]) - NumOfOne(Num[j]);data[i][j].move = data[i][j].suls >= 0 ? (NumOfOne(Num[i]) - NumOfOne(Num[i] & Num[j])) : (NumOfOne(Num[j]) - NumOfOne(Num[i] & Num[j]));}while (1) {gets_s(ch);if (IfNumber(ch[0]) && (ch[1] == '+' || ch[1] == '-') && IfNumber(ch[2]) && ch[3] == '=' && IfNumber(ch[4]))cul(ch);}
}

六、总结:

最后测试5+7=9确实无解,短视频误人。

c语言----移动n根火柴使等式成立相关推荐

  1. 移动一根火柴使等式成立js版本(递归)

    修改成递归版本 思路: 1.设定规则数组,比如:1加一根火柴只可以变成7. 2.设定方法数组,比如:一个数增加了一根火柴,其他的数必然减少一根火柴. 3.增加Array方法,由元素名和方法,得到规则对 ...

  2. 企业面试题:一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式。

    <p><span style="font-size:14px">一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式 ...

  3. 用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次。

    用1.2.3.4.5.6.7.8.9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次. 以下是所有的7 个答案供参考: 12*483=5796 18*297=5346 ...

  4. 取木棒21根c语言,关于m根火柴 ,人机最多取n根火柴(21根火柴进阶)

    对于这个题,每个人看法不一样,理解不一样,当然程序也不一样. 此题目中,我设置的机器与人都是随机数 主要原理应该大致一样 此题中,我们的要求,拿到最后一根火柴,则算输. 拿到最后一根火柴则算输,那么我 ...

  5. C语言 现有21根火柴,两个轮流取,一种解法:小学生奥数题:9根火柴棒,两个人轮流取,每次只能取1,2或3根,取完为止,总数为偶数者为胜...

    设r为桌上剩下的火柴棒数量(开始时奇数,中间可以是偶数),当前轮到某个人取火柴,h为他手上的火柴棒,0表示偶数,1表示奇数,y为他的最终的火柴棒数量,0表示偶数,1表示奇数,定义函数f(r,h),如果 ...

  6. c语言人机23根火柴游戏,23根火柴游戏.doc

    23根火柴游戏 #include #include #define NUM 20 using namespace std; void main() { //规则的输出 cout< cout< ...

  7. python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)

    问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...

  8. php随机数字不重复使等式成立_Schur补与矩阵打洞,SMW求逆公式,分块矩阵与行列式(不)等式...

    矩阵论记号约定​zhuanlan.zhihu.com Schur补与矩阵打洞 考虑正态随机向量 ,求 条件分布的一个类似于线性回归的常用技巧是--寻找常值矩阵 适合 :对于正态变量而言独立等价于不相关 ...

  9. python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)

    首发于微信公众号:Python编程时光 ' 每周三更新五个冷知识,欢迎前往订阅! 01. 交互式"_"操作符 对于 _ ,我想很多人都非常熟悉. 给变量取名好艰难,用 _: 懒得长 ...

最新文章

  1. Spring2.5.6学习笔记-实例化bean的几种方法
  2. 51nod 1717 好数 (水题)
  3. Swap Letters CodeForces - 1215C(贪心)
  4. md5字符串输入c语言,请问C语言怎么实现对一长串字符进行MD5加密?
  5. 飞信php接口 web service
  6. 【图像加密】基于matlab RSA图像加密解密【含Matlab源码 1442期】
  7. 操作系统文件的物理结构(文件分配方式)
  8. 08年最感人的文章,不信你不哭
  9. Calander 的小程序 简单日历的制作
  10. 【开源SPL】列存数据仓库怎样更高效
  11. bbp公式求圆周率、python_【并行计算】六种方法计算圆周率
  12. NodeJS C++ Addons之C++类实例包装与异步操作
  13. Hapi.js 起步 - 写给前端开发的 Node Web 框架入门
  14. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo
  15. 【Web技术】1002- 应式布局,你需要知道的一切
  16. 快速简单制作macOS Ventura系统ISO格式镜像
  17. 汤不热真香,教练我要学这个动作
  18. 软件测试-Stream IPHONE手机抓包
  19. d3.js 旋转图形_江苏轿车车轮旋转弯曲疲劳试验机公司,请看
  20. 关于股市的大起大落有感!

热门文章

  1. python编写一个名片_python基础-实现名片功能
  2. 扩充C盘(将D盘的内存分给C盘)
  3. OneNote子弹笔记(How to Bullet Journal with OneNote)
  4. Google Play Store 应用无法安装解决方案
  5. 计算机读不出相机磁盘,相机存储卡读不出来怎么办?相机存储卡无法读取
  6. 手机android的文件怎么恢复,安卓手机office文件怎么恢复?
  7. 2022电大国家开放大学网上形考任务-简明创新方法非免费(非答案)
  8. 网页采集器-八爪鱼采集器
  9. SLAM总结(三)-传感器之各传感器特性
  10. 五,JavaScript数组·上