竞赛水题:通关密码。
通关密码
程序输入说明
程序输入样例
4 2 2
程序输出样例
4+2-2
[EOF]
提示
测试数据中不存在多解的情况
#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;
}
竞赛水题:通关密码。相关推荐
- 2016年安徽省程序设计竞赛 水题C,D,E 题解
A,B太水了就不写了- - 感觉思路都挺清楚的,不多解释了 C.转啊转 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 7 ...
- 图形面积——竞赛水题
题目描述 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示,在10*10的二维数组中,有"*" ...
- 【牛客 - 302哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)】 小乐乐算数字(水题,快速幂,lowbit)
题干: 小乐乐最喜欢玩数字了. 小乐乐最近迷上了2这个整数,他觉得2的幂是一种非常可爱的数字. 小乐乐想知道整数x的最大的 2的幂 (2^y)的因子. y为整数. 输入描述: 输入整数x.(1< ...
- MOCTF-Web-还是水题
1.打开题目如下:还是一道水题 2.打开题目链接:http://119.23.73.3:5001/web2/ 3.我发现输入框无法输入数据,于是我F12查看 发现存在disabled属性,这就是造成我 ...
- 2021云计算技能竞赛真题卷(附标准答案)
2021云计算技能竞赛真题卷 "云计算技术与应用"S卷 场景描述 一.目标任务 某企业拟搭建私有云平台,以实现资源池化弹性管理.企业应用集中管理.统一安全认证和授权等管理.试按照赛 ...
- 美国大学生数学建模竞赛赛题题型分类
美国大学生数学建模竞赛赛题题型分类 美赛赛题应用模型 • 运筹优化类问题(规划模型.排队论.神经网络.启发式算法) • 评价类问题(层次分析法.聚类分析法.主成分分析评价法等) • 机理分析类问题(回 ...
- 2020年全国大学生数学建模竞赛B题穿越沙漠问题——建立整数线性规划模型(ILP)——通过LINGO求解
2020年全国大学生数学建模竞赛B题 穿越沙漠 题目是讲玩家在不同地图下穿越沙漠,所获得的资金数要最多(大概是这个意思).然后通过文章的描述又总结了N个约束条件.整体的思路就是对资金最大化作为目标函数 ...
- 2018年美国大学生数学建模竞赛原题、翻译及思路整理
参加了2018年的美赛,整理了一些参考资料,需要的话就拿去吧. 具体内容是:2018年美国大学生数学建模竞赛原题.翻译及思路整理,有兴趣的小伙伴可以看看 链接:https://pan.baidu.co ...
- sdut 2154:Shopping(第一届山东省省赛原题,水题)
Shopping Time Limit: 1000MS Memory limit: 65536K 题目描述 Saya and Kudo go shopping together. You can as ...
最新文章
- 为什么美国互联网没有“运营”岗?
- 今天俺要说一说工厂方法模式(Factory)
- [html] 实现两列等宽布局的方式有哪些?
- [密码学基础][每个信息安全博士生应该知道的52件事]52.先进的应用概念 系统的大致安全需求
- 谷歌能否赶上「元宇宙」这趟快车?
- javascript 西瓜一期 13 十六进制的数数方式与进位
- 你的公司,远程办公多久了?
- Tool for FMEA
- 【图像检测】基于区域生长算法实现对焊接孔隙检测matlab代码
- mac air 分区以后 分区内存消失了
- java正则判断所有的标点符号_java正则匹配标点符号
- 关于嵌入式EMW3162 Wifi模块的网络配置与测试
- 小程序不刷新页面更新数据
- IT:成为服务经纪人的未来
- WPS高亮显示重复项并删除重复项有效防止数据重复录入
- android 带刻度的滑动条_Android实现滑动刻度尺效果
- [乐意黎转载]CentOS yum 源的配置与使用
- 定时任务 Timer 的学习
- composer require topthink/think-migration报错
- 微观经济学案例分析(六)