通关密码

  题目描述:
  周末,小雪到游乐园去游玩,在智力大冒险的游戏中,他一路过关斩将,现在只剩下一个问题,只要他能回答出来,那么智力宝库的大门就会打开,小雪就能得到过关的奖品。宝库的大门上有形如A □ B □ C的算术表达式,其中A、B、C是任意整数(-1025<A,B,C<1025),符号□中要填放加或减运算符。宝库的守门人会按顺序任意给出A、B、C三个数,小雪要做的就是想想如何向符号□中填放加、减号,使运算结果为4。如能得到4,那么告诉守门人计算式,他就会为你打开宝库大门。如不能得到4,就告诉守门人“no”,那么他就会重新给你一组数据。你能编程帮助小雪解决这个难题吗?

程序输入说明

一共有三行。每行包含一个整数,按顺序分别表示A,B,C。

程序输入样例

4
2
2

程序输出样例

4+2-2
[EOF]

提示

A,B,C可以为负数,假设A=4,B=2,C=-2,这时表达式不允许为:4+2+(-2),正确形式应为:4+2-2。
测试数据中不存在多解的情况 

多说无益,直接上代码。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAX_L 108
using namespace std;
int a[MAX_L+8],b[MAX_L+8],c[MAX_L+8],tmp[MAX_L+8];//!定义四个数组 数组的长度均为116。MAX_L值已经定义为108。
int len_a,len_b,len_c,len_tmp;//!定义四个变量,a,b,c,tmp
int res1[MAX_L+8],len_1;
int res2[MAX_L+8],len_2;
int res3[MAX_L+8],len_3;
int res4[MAX_L+8],len_4;//!分别定义四个数组,数组长度为len_1 len_2 len_3 len_4bool fa=0,fb=0,fc=0;//!定义四个布尔变量,用来记录三个数字的正负char s[MAX_L+8];//!定义一个长度为116的字符数组S 用来读入输入的字符串,即题目中的数字//!(字符串模拟)输入数,判断正负并首尾调换,并转换为整型数组储存。
void read(int num[],int &len,bool &f){scanf("%s",&s);//!输入字符串int l=strlen(s);//!测量字符串长度len=0;if (s[0]=='-') f=1;//!如果输入的为负值,布尔变量的值变为1:for (int i=0;i<l;++i) if ('0'<=s[i] && s[i]<='9') num[len++]=s[i]-'0';//!转化为int类型的数组for (int i=0;i<len/2;++i) swap(num[i],num[len-i-1]);//!首尾调换
}//!大数加法函数
void add(int res[],int &n,int a[],const int &la,int b[],const int &lb)
{int len=max(la,lb);//!找出两个长度中,最大的那一个for (int i=la;i<len;++i) a[i]=0;//!多出的长度数字改为0for (int i=lb;i<len;++i) b[i]=0;//!多出的长度数字改为0for (int i=0;i<=len;++i) res[i]=0;//!0-len长度全部重置为0;for (int i=0;i<len;++i) {res[i]+=a[i]+b[i];res[i+1]+=res[i]/10;res[i]%=10;
}n=len;while (res[n]>0) res[n+1]=res[n]/10,res[n]%=10,++n;//!最后一位进位,如果大于10,长度加一//printf("%d %d\n",n,res[0]);
}//!判断两个式子能否相减的函数。
bool cmp(int a[],int &la,int b[],int &lb) {if (la>lb) return 1;if (la<lb) return 0;for (int i=la-1;i>=0;--i)//!C++中写成--i可以减轻机器的负担。{if (a[i]>b[i]) return 1;//!返回1为真,返回0为假。if (a[i]<b[i]) return 0;}return 1;
}//!大数减法函数
void odd(int res[],int &n,int a[],const int &la,int b[],const int &lb) {int len=max(la,lb);//!取最大的长度for (int i=la;i<len;++i) a[i]=0;//!多出的长度空间改为0for (int i=lb;i<len;++i) b[i]=0;//!多出的长度空间改为0for (int i=0;i<=len;++i) res[i]=0;for (int i=0;i<len;++i) {res[i]+=a[i]-b[i];if (res[i]<0) res[i+1]-=1,res[i]+=10;//!如果相反,退位(即i+1),加10;}n=len;while (n && res[n-1]==0) --n;//!总长度-1,可以减多次,长度不能为0,最后结果若刚好为0,则输出即是0;
}//!负责输出的函数//!逆序输出
void print(int num[],int n){for (int i=n-1;i>=0;--i) printf("%d",num[i]);
}//!下面的注释代码是大佬用来检测自己所写的代码是否正确的。
int main() {read(a,len_a,fa);read(b,len_b,fb);read(c,len_c,fc);
//!读入三个数字串 存放到三个数组 a[] b[] c[]中
/*for (int i=0;i<len_a;++i) printf("%d",a[i]);putchar('\n');
for (int i=0;i<len_b;++i) printf("%d",b[i]);putchar('\n');
for (int i=0;i<len_c;++i) printf("%d",c[i]);putchar('\n');*///!odd大数减法 cmp比较函数 add大数加法//!如果fa=0,运行该if语句。即数字a>=0时候运行。if (!fa) {add(tmp,len_tmp,a,len_a,b,len_b);//!a,b相加 a+b//for (int i=len_tmp-1;i>=0;--i) printf("%d",tmp[i]);if (cmp(tmp,len_tmp,c,len_c))//!判断能否相减大于0,可以则执行{odd(res1,len_1,tmp,len_tmp,c,len_c);//!a+b-c//for (int i=len_1-1;i>=0;--i) printf("%d",res1[i]);putchar('\n');//!位数为1 值为4输出if (len_1==1 && res1[0]==4) { print(a,len_a);putchar('+');print(b,len_b);putchar('-');print(c,len_c);return 0; }}add(res2,len_2,tmp,len_tmp,c,len_c); //!不能相减,则相加。a+b+c;//!位数为1 值为4输出if (len_2==1 && res2[0]==4) { print(a,len_a);putchar('+');print(b,len_b);putchar('+');print(c,len_c);return 0; }add(tmp,len_tmp,a,len_a,c,len_c);//!a+c//!判断a+c能否减b 大于0 可以则执行if (cmp(tmp,len_tmp,b,len_b)) {odd(res3,len_3,tmp,len_tmp,b,len_b);//!a+c-b//!位数为1 值为4输出if (len_3==1 && res3[0]==4) { print(a,len_a);putchar('-');print(b,len_b);putchar('+');print(c,len_c);return 0; }}//!a能否减b 大于0 可以执行if (cmp(a,len_a,b,len_b)) {odd(tmp,len_tmp,a,len_a,b,len_b);//!a-b//!判断能否a-b-c 大于0 则执行if (cmp(tmp,len_tmp,c,len_c)) {odd(res4,len_4,tmp,len_tmp,c,len_c);//!a-b-c//!位数为1 值为4输出if (len_4==1 && res4[0]==4) { print(a,len_a);putchar('-');print(b,len_b);putchar('-');print(c,len_c);return 0; }}}}//!上一块代码判断了 a+b+c a+c-b a+b-c a-b-c (a>=0)的时候的所有情况  b c 取绝对值是没有影响的//!若a小于0else {add(tmp,len_tmp,a,len_a,b,len_b);//!a+b//!判断c能减a+b吗,可以就执行。if (cmp(c,len_c,tmp,len_tmp)) {odd(res1,len_1,c,len_c,tmp,len_tmp);//!c-(a+b)//!位数为1 值为4输出if (len_1==1 && res1[0]==4) { putchar('-');print(a,len_a);putchar('-');print(b,len_b);putchar('+');print(c,len_c);return 0; }}add(tmp,len_tmp,a,len_a,c,len_c);//!a+c//!b能减(a+c)吗,可以就执行if (cmp(b,len_b,tmp,len_tmp)) {odd(res2,len_2,b,len_b,tmp,len_tmp);//!b-(a+c)//!位数为1 值为4输出if (len_2==1 && res2[0]==4) { putchar('-');print(a,len_a);putchar('+');print(b,len_b);putchar('-');print(c,len_c);return 0; }}add(tmp,len_tmp,b,len_b,c,len_c);//!b+c;//!b+c能-a吗 可以就减if (cmp(tmp,len_tmp,a,len_a)) {odd(res3,len_3,tmp,len_tmp,a,len_a);//!(b+c)-a;//!位数为1 值为4输出if (len_3==1 && res3[0]==4) { putchar('-');print(a,len_a);putchar('+');print(b,len_b);putchar('+');print(c,len_c);return 0; }}}//!这一块代码判断了a-b+c  a+b-c a+b+c (a<0) 无需考虑 a-b-c因为必小于0   bc取绝对值是没有影响的printf("no\n");return 0;
}

竞赛水题:通关密码。相关推荐

  1. 2016年安徽省程序设计竞赛 水题C,D,E 题解

    A,B太水了就不写了- - 感觉思路都挺清楚的,不多解释了 C.转啊转 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 7 ...

  2. 图形面积——竞赛水题

    题目描述 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在10*10的二维数组中,有"*" ...

  3. 【牛客 - 302哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)】 小乐乐算数字(水题,快速幂,lowbit)

    题干: 小乐乐最喜欢玩数字了. 小乐乐最近迷上了2这个整数,他觉得2的幂是一种非常可爱的数字. 小乐乐想知道整数x的最大的 2的幂 (2^y)的因子. y为整数. 输入描述: 输入整数x.(1< ...

  4. MOCTF-Web-还是水题

    1.打开题目如下:还是一道水题 2.打开题目链接:http://119.23.73.3:5001/web2/ 3.我发现输入框无法输入数据,于是我F12查看 发现存在disabled属性,这就是造成我 ...

  5. 2021云计算技能竞赛真题卷(附标准答案)

    2021云计算技能竞赛真题卷 "云计算技术与应用"S卷 场景描述 一.目标任务 某企业拟搭建私有云平台,以实现资源池化弹性管理.企业应用集中管理.统一安全认证和授权等管理.试按照赛 ...

  6. 美国大学生数学建模竞赛赛题题型分类

    美国大学生数学建模竞赛赛题题型分类 美赛赛题应用模型 • 运筹优化类问题(规划模型.排队论.神经网络.启发式算法) • 评价类问题(层次分析法.聚类分析法.主成分分析评价法等) • 机理分析类问题(回 ...

  7. 2020年全国大学生数学建模竞赛B题穿越沙漠问题——建立整数线性规划模型(ILP)——通过LINGO求解

    2020年全国大学生数学建模竞赛B题 穿越沙漠 题目是讲玩家在不同地图下穿越沙漠,所获得的资金数要最多(大概是这个意思).然后通过文章的描述又总结了N个约束条件.整体的思路就是对资金最大化作为目标函数 ...

  8. 2018年美国大学生数学建模竞赛原题、翻译及思路整理

    参加了2018年的美赛,整理了一些参考资料,需要的话就拿去吧. 具体内容是:2018年美国大学生数学建模竞赛原题.翻译及思路整理,有兴趣的小伙伴可以看看 链接:https://pan.baidu.co ...

  9. sdut 2154:Shopping(第一届山东省省赛原题,水题)

    Shopping Time Limit: 1000MS Memory limit: 65536K 题目描述 Saya and Kudo go shopping together. You can as ...

最新文章

  1. 为什么美国互联网没有“运营”岗?
  2. 今天俺要说一说工厂方法模式(Factory)
  3. [html] 实现两列等宽布局的方式有哪些?
  4. [密码学基础][每个信息安全博士生应该知道的52件事]52.先进的应用概念 系统的大致安全需求
  5. 谷歌能否赶上「元宇宙」这趟快车?
  6. javascript 西瓜一期 13 十六进制的数数方式与进位
  7. 你的公司,远程办公多久了?
  8. Tool for FMEA
  9. 【图像检测】基于区域生长算法实现对焊接孔隙检测matlab代码
  10. mac air 分区以后 分区内存消失了
  11. java正则判断所有的标点符号_java正则匹配标点符号
  12. 关于嵌入式EMW3162 Wifi模块的网络配置与测试
  13. 小程序不刷新页面更新数据
  14. IT:成为服务经纪人的未来
  15. WPS高亮显示重复项并删除重复项有效防止数据重复录入
  16. android 带刻度的滑动条_Android实现滑动刻度尺效果
  17. [乐意黎转载]CentOS yum 源的配置与使用
  18. 定时任务 Timer 的学习
  19. composer require topthink/think-migration报错
  20. 微观经济学案例分析(六)

热门文章

  1. 手把手教您-将Gallery导入eclipse
  2. 荷兰外资企业招聘asp.net高级程序员(北京)
  3. VBA 批量打印多工作簿的指定工作表
  4. java负载均衡原理_多种负载均衡算法及其 Java 代码实现
  5. Selenium定位元素操作实例详解
  6. 小程序图片上传与回显(包括前后端)
  7. 解决M1芯片的Homebrew安装问题--For M1使用者
  8. centos8怎么启动docker
  9. ASP连接各种数据库的方法
  10. Android面试题小结