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

题目描述

代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define USE_LEN 10
  5. #define OPERATE_LEN 4
  6. #define RES 2000
  7.  
  8. int flag = ;
  9.  
  10. void judge(int index,const char *arr,const char *ch)
  11. {
  12. int i,j,tmp,sum,res;
  13. int tmp_num[USE_LEN]; //存储组合的数字
  14. char tmp_ch[USE_LEN];
  15.  
  16. //1.验证是否符合要求
  17. tmp=sum=;
  18. for (i= ; i<index ; i++) //遍历输入的数字
  19. {
  20. //组合数字
  21. if (sum == )
  22. {
  23. sum = arr[i]-'';
  24. }
  25. else
  26. {
  27. sum = sum*+(arr[i]-'');
  28. }
  29.  
  30. if (ch[i]!=' ')
  31. {
  32. tmp_num[tmp] = sum;
  33. tmp_ch[tmp] = ch[i];
  34. sum = ;
  35. tmp ++;
  36. }
  37. else
  38. {
  39. if (sum== && i!=index-)
  40. return ;//0***的数字不符合要求
  41. }
  42. }
  43.  
  44. //2.验证是否满足要求
  45. res = tmp_num[];
  46. i=,j=; //i标记运算符下标 , j标记数字
  47. while (j < tmp)
  48. {
  49. if (tmp_ch[j] =='*')
  50. {
  51. sum = tmp_num[j];
  52. while (tmp_ch[j] == '*')
  53. {
  54. sum *= tmp_num[++j];
  55. }
  56. }
  57. else
  58. {
  59. sum = tmp_num[j];
  60. }
  61.  
  62. switch(tmp_ch[i])
  63. {
  64. case '+':res +=sum;break;
  65. case '-':res -=sum;break;
  66. case '*':res *=sum;break;
  67. }
  68. i = j++;
  69. }
  70.  
  71. //3.打印符合要求的式子
  72. if (res == RES)
  73. {
  74. flag ++;
  75. for (i= ; i<index ; i++)
  76. {
  77. printf("%c",arr[i]);
  78. if (ch[i]!=' ' && ch[i]!=)
  79. printf("%c",ch[i]);
  80. }
  81. printf("=\n");
  82. }
  83. return ;
  84. }
  85.  
  86. void dfs(int index,int len,const char *arr,char *ch)
  87. {
  88. int i;
  89. char operate[OPERATE_LEN] = {'*','+','-',' ',}; //可用运算符
  90. if (len == )//运算符插入完成 (符号数比数字少1)
  91. {
  92. judge(index+,arr,ch); //判断插入运算符后的式子是否符合要求
  93. return ;
  94. }
  95. else
  96. {
  97. for (i= ; i<OPERATE_LEN ; i++)
  98. {
  99. ch[index] = operate[i];//插入运算符
  100. dfs(index+,len-,arr,ch);
  101. }
  102. }
  103.  
  104. return ;
  105. }
  106.  
  107. int main(void)
  108. {
  109. char arr[USE_LEN]; //存储输入数据
  110. char ch[USE_LEN]; //存储插入的符号 (放在每个数字后面)
  111.  
  112. memset(arr,,sizeof(arr));
  113. memset(ch,,sizeof(ch));
  114.  
  115. scanf("%s",arr);
  116. if (strcmp(arr,"2000=") == ) //至少插入一个运算符
  117. {
  118. printf("IMPOSSIBLE");
  119. return ;
  120. }
  121. else
  122. {
  123. dfs(,strlen(arr)-,arr,ch); //枚举情况
  124. }
  125.  
  126. if (flag == )
  127. printf("IMPOSSIBLE");
  128.  
  129. return ;
  130. }

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. prometheus告警配置注意事项

    global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minut ...

  2. 6 款最棒的 Go 语言 Web 框架简介

    地址: https://studygolang.com/articles/11897?fr=sidebar

  3. PAT 1081 Rational Sum

    1081 Rational Sum (20 分)   Given N rational numbers in the form numerator/denominator, you are suppo ...

  4. 一个简单CI/CD流程的思考

    因为公司有两地研发团队,在统一CI/CD上难度不亚于两家公司合并后的新流程建立,并非不可攻克,简单描述下心得. 首先,代码管理使用gerrit -> 因其强大的 codereview 功能被选中 ...

  5. Winform关于未找到元数据文件.exe和不包含适合于入口点的静态“Main”方法

    在三层架构中ItcastCaterModel项目是被其他项目引用的,所以输出类型为类库.

  6. python3练习-发送IP地址到邮箱(使用日志)

    看了下python下的logging模块,和java的log4j差不多,把之前的代码改为使用log配置的方式实现功能(需求和之前的相同,地址"http://www.cnblogs.com/G ...

  7. Python---高级函数map, filter, zip, enumerate等的用法

    今天看自然语言处理这本书的时候,被这里的高级函数的概念吸引了,因为我觉得所有的函数都只是函数而已,是为了实现特定功能而实现的,不应该有高级,低级之分啊!不过了解之后,发现这几个函数确实是有点高级,非常 ...

  8. Forth 内存布局

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  9. python编码及转换

    第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于 ...

  10. Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮

    效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...