问题描述
  计算器和计算机的大量普及也有其弊端。即便是受过专业技术训练的学生们也很可能缺乏计算能力。由于电脑的大量使用,很多人无法心算出7*8这样的算式,甚至是用纸和笔也算不出13*。不过谁在意呢?
  Bartjens教授十分在意——因为他比较传统。他决定给学生布置一些计算作业,并且不能使用电子设备。为了批改方便,他决定使得几乎所有题答案都是2000,不过不全是,否则会被学生发现然后就不仔细计算了。
  不幸的是,Bartjens教授的打印机实在是太旧了,不能和新的打印机兼容。打印出了题目后,教授发现所有的符号都丢失了!例如2100-=,被打印成了2100100=。不过,数字和等号被正确的打印了。
  更糟糕的是,教授的试题原稿不见了。因此,他需要恢复出这些题原来的样子。如果答案是2000,那么2100100=可能是:
  -=
  **+=
  **-=
  **=
  *-*-+=
  Bartjen教授记得几点:
  .他写的数字没有前导零。例如2**=就是不可行的。
  .他写0的时候不会写多个0。例如2*+=就是不可行的。
  .他只用二元运算符,不用取负。所以2*-*-+=也不合法。
  .他只用+、-、*,不用/和括号。
  .这些算式按照正常的优先级顺序计算。
  你需要帮助barjen教授恢复这些题目。你需要在算式中插入至少一个运算符,使得答案是2000。有多少种可能的算式呢?
输入格式
  输入包含一组数据。这组数据有n个数字(<=n<=),后面跟着一个=号。
输出格式
  输出包含若干行,每一行是一个可行的解,具体格式见样例。按字典序从小到大输出这些字符串。如果无解,输出一行IMPOSSIBLE。
样例输入
=
【样例输出】
**+=
**-=
-=
数据规模和约定
  <=n<=

题目描述

代码如下:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define USE_LEN 10
#define OPERATE_LEN 4
#define RES 2000 int flag = ; void judge(int index,const char *arr,const char *ch)
{
int i,j,tmp,sum,res;
int tmp_num[USE_LEN]; //存储组合的数字
char tmp_ch[USE_LEN]; //1.验证是否符合要求
tmp=sum=;
for (i= ; i<index ; i++) //遍历输入的数字
{
//组合数字
if (sum == )
{
sum = arr[i]-'';
}
else
{
sum = sum*+(arr[i]-'');
} if (ch[i]!=' ')
{
tmp_num[tmp] = sum;
tmp_ch[tmp] = ch[i];
sum = ;
tmp ++;
}
else
{
if (sum== && i!=index-)
return ;//0***的数字不符合要求
}
} //2.验证是否满足要求
res = tmp_num[];
i=,j=; //i标记运算符下标 , j标记数字
while (j < tmp)
{
if (tmp_ch[j] =='*')
{
sum = tmp_num[j];
while (tmp_ch[j] == '*')
{
sum *= tmp_num[++j];
}
}
else
{
sum = tmp_num[j];
} switch(tmp_ch[i])
{
case '+':res +=sum;break;
case '-':res -=sum;break;
case '*':res *=sum;break;
}
i = j++;
} //3.打印符合要求的式子
if (res == RES)
{
flag ++;
for (i= ; i<index ; i++)
{
printf("%c",arr[i]);
if (ch[i]!=' ' && ch[i]!=)
printf("%c",ch[i]);
}
printf("=\n");
}
return ;
} void dfs(int index,int len,const char *arr,char *ch)
{
int i;
char operate[OPERATE_LEN] = {'*','+','-',' ',}; //可用运算符
if (len == )//运算符插入完成 (符号数比数字少1)
{
judge(index+,arr,ch); //判断插入运算符后的式子是否符合要求
return ;
}
else
{
for (i= ; i<OPERATE_LEN ; i++)
{
ch[index] = operate[i];//插入运算符
dfs(index+,len-,arr,ch);
}
} return ;
} int main(void)
{
char arr[USE_LEN]; //存储输入数据
char ch[USE_LEN]; //存储插入的符号 (放在每个数字后面) memset(arr,,sizeof(arr));
memset(ch,,sizeof(ch)); scanf("%s",arr);
if (strcmp(arr,"2000=") == ) //至少插入一个运算符
{
printf("IMPOSSIBLE");
return ;
}
else
{
dfs(,strlen(arr)-,arr,ch); //枚举情况
} if (flag == )
printf("IMPOSSIBLE"); return ;
}

C解法

解题思路:

将运算符“*”,“+”,“-”,“ ”插入到数字中,

枚举其不同组合情况下符合条件的。

采用DFS搜索满足条件的组合

[蓝桥杯]ALGO-181.算法训练_According to Bartjens的更多相关文章

  1. 蓝桥杯练习系统— 算法训练 Beaver's Calculator

    问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...

  2. 蓝桥杯练习系统算法训练习题加答案java版本

    附上百度文库的链接:http://wenku.baidu.com/view/afb78d36b42acfc789eb172ded630b1c59ee9bf7

  3. python+java蓝桥杯ACM日常算法题训练(一)10基础题

    目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.d ...

  4. 蓝桥杯 algo——6 安慰奶牛 (最小生成树)

    问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计 划除去P条道路中尽可能多的道路 ...

  5. 蓝桥杯 C语言 入门训练 Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  6. 蓝桥杯 C语言 入门训练 序列求和

    问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一 ...

  7. 蓝桥网试题 java 算法训练 区间k大数查询

    -------------------------------------------------------------------------- 数组也有sort方法 尽量把输入和操作分开写 -- ...

  8. 算法训练 K好数(C/C++)AC码

    蓝桥杯 算法训练 K好数 AC码 题目要求: 算法训练 K好数 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如 ...

  9. Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)

    试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...

随机推荐

  1. 5、SAMBA服务二:配置实例

    ①:SAMBA服务一:参数详解 ②:SAMBA服务二:配置实例 5.2.3.Samba共享目录配置实例 1.允许匿名用户读取/it共享目录,修改/etc/samba/smb.conf,在最后添加以下内 ...

  2. python学习:数据类型

    python有两种索引方式.一种从左至右,下标从0开始:一种从右至左,下标从-1开始. python有六种数据类型: 不可变数据(四个):Number(数字).String(字符串).Tuple(元组 ...

  3. 活动代码页437--修改windows的系统编码

    1.首先查看系统编码 win+R打开运行,输入cmd回车,打开命令提示符窗口,输入chcp回车,会查询当前系统的活动代码页,它指明了当前系统使用的编码: 或者,打开cmd后,点击cmd窗口左上角图标, ...

  4. mac上配置java开发环境

    项目在mac上跑起来的步骤: 1. 访问,https://brew.sh/  装上这个然后  brew install git  brew install maven, settings.xml需要放 ...

  5. Linux .vimrc 设置项

    Linux 下,.vimrc 有两个.一个是全局使用的(/etc/vimrc),另一个是个人使用的(~/.vimrc). 大部分的情况下,我们只需要设置自己目录下的.vimrc 即可. # vim ~ ...

  6. coursera-斯坦福-机器学习-吴恩达-笔记week2

    1 多元线性回归 1.1 假设函数 多元线性回归是指有多个特征特征变量的情况.此时我们修改假设函数hθ(x)=θ0+θ1∗x为hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn.设x0=1,x为特征向 ...

  7. C++中 string 的用法大全

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  8. Hibernate----面试题

    什么是Hibernate? hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率. 什么是ORM? orm不过是一种思想,对象关系映射.是对象关系模型,如h ...

  9. TCP/IP协议三次握手与四次握手

    TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式  TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式  上图中有几个 ...

  10. L333 Should You Listen to Music While You Work?

    Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...