问题描述
  计算器和计算机的大量普及也有其弊端。即便是受过专业技术训练的学生们也很可能缺乏计算能力。由于电脑的大量使用,很多人无法心算出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. 『TensorFlow』SSD源码学习_其七:损失函数

    Fork版本项目地址:SSD 一.损失函数介绍 SSD损失函数分为两个部分:对应搜索框的位置loss(loc)和类别置信度loss(conf).(搜索框指网络生成的网格) 详细的说明如下: i指代搜索 ...

  2. openLDAP安装时无法操作根节点数据,提示的是This base cannot be created with PLA.

    1.无法操作根节点数据,提示的是This base cannot be created with PLA. 解决办法 1)添加一个base.ldif文件,里面的dc和配置文件里的保持一致即可 dn: ...

  3. python几种常见的模块安装方法

    1. 在线安装 1.1 在命令提示符中运行 pip install package_name 指令  注:具体前置步骤和教程:http://www.cnblogs.com/jfl-xx/p/72895 ...

  4. HTTP 错误 500.19 - Internal Server Error v4.0.30319

    1 打开运行,输入cmd进入到命令提示符窗口.2 进入到C:\Windows\Microsoft.NET\Framework\v4.0.30319 目录.3 输入aspnet_regiis.exe - ...

  5. MapServer Tutorial——MapServer7.2.1教程学习(大纲)

    MapServer Tutorial——MapServer7.2.1教程学习(大纲) 前言 最近在学习Gis方面的知识,因为电脑硬件配置偏低,顾选择MapServer入手.网上搜索MapServer系 ...

  6. node设置跨域

    开发过程中在build/dev-server.js配置相关代码以跨域 app.use('/api',proxyMiddleware({ target:'http://m.maizuo.com/v4', ...

  7. 为你详解Linux安装GCC方法

    下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/查 ...

  8. 项目中Java Resources有红叉,其它没有,解决办法

    说起这个这个地方,我课改了好久 起初,我把原先项目的JDK版本改了,右击项目Build Path,然后换掉里面的JRE,没用, 然后右击项目,点击properties,找到在Project Facet ...

  9. session_unset,session_destroy

    session_unset()释放当前用户在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的sessionid session_destroy()删除当前用户对应 ...

  10. «面向对象程序设计(java)»第三周学习总结 周强 201771010141

    实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3)掌握Java语言构造基本程序语法知识(ch1-ch3): (4)利用已 ...