英雄会第四届在线编程大赛·线上初赛:带通配符的数
2014-04-10 20:33
253 查看
1.题目
给定一个带通配符问号的数W,问号可以代表任意一个一位数字。再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.
输出格式
每行一个整数表示结果。
输入样例
36?1?8
236428
8?3
910
?
5
输出样例
100
0
4
2.分析
拿到这个题目,如果我们自己直接计算的话,肯定是从前往后比较,那么就用如下几种情况在比较时这里我们把W中的?位都看成9,如8?9看成899,这样做的便于统一数字比较
1.W和X对应位相等时
如W=89,X=80比较第1位;
W=801,X=802比较第1、2位
这时候直接舍弃最前相等的位,从不等的位开始比较
即
W=89,X=80比较W=9,X=0
W=801,X=802比较W=01,X=02->W=01,X=02比较W=1,X=2
2.W对应位小于X对应位
如W=8,X=9;
W=809,X=819
显然这时候W>X的可能性为0
3.W对应位大于X对应位
如W=?,X=5
W=8?7?,X=2000
W=7?7?,X=7760
W=??,X=99
这是最复杂的一种情况,分为如下两种情况
(1).当W和X对应位是数字时
这时候W一定比X大,所以可能的情况就是取决于?有多少个
如W=8?7?,X=2000是可能的个数为10*10
(2).当W和X对应位是?时
a)W这个?对应位比X大
如W=7?7?,X=7760第一个问号取值为8、9,这时候继续往后面对比时W一定比X大,故此时变得W和X都是数字时一样,可能的情况取决于往后数的?有多少个
如W=7?7?,X=7760此种情况的个数为2*10(8、9->2,1个?->10)
b)W这个?对应位和X相等
这又转变为W和X对应位相等的情况
如W=7?7?,X=7760在此种情况下即为比较W=777?,X=7760->W=7?,X=60,即此种情况下可能的情况为10
那么W=7?7?,X=7760满足要求的情况为如上两种情况的和20+10=30
3.实现程序
显然这种“待求解问题可以简化为规模更小的问题”的程序用递归最为合适#include<stdio.h> #include<stdlib.h> #include <string.h> double a(char *W, char *X) { int i, length, wValue, xValue, w_xValue; double result; //注意结果必须保存为double类型 //计算输入串长度 length = strlen(W); //这里将当前的字符转换成数字,不确定的?转换成9 wValue = (W[0] == '?' ? 9 : ((int)W[0] - 48)); xValue = ((int)X[0] - 48); //获得当前两个对应位的差 w_xValue = wValue - xValue; if (w_xValue < 0) { return 0; } else if (w_xValue == 0) { return length>1 ? a(W+1, X+1) : 0; //注意length=1时不能向下递归应该返回0 } else { result = (W[0] == '?' ? w_xValue : 1); if (length > 1) { for (i = 1; i < length; i++) { result *= (W[i] == '?' ? 10 : 1); } if (W[0] == '?') { result += a(W+1, X+1); } } return result; } } int main() { char W[11]; char X[11]; //循环获得输入 while(gets(W) != NULL) { gets(X); //输出结果 printf("%.0f\n", a(W, X)); } return 0; }
4.程序说明
根据分析写出程序是很显然的,但是要注意几个问题1.result不能采用int,当极限情况W=??????????,X=1000000000时会产生溢出
2.注意length==1时不能继续往下递归
3.这个CSDN的烦人的测试用例输入把我搞晕了,开始怎么也搞不对,这个CSDN最好还是给个示例吧,我的奖品都是因为它没了,:-(...
原创,转载请注明来自http://blog.csdn.net/wenzhou1219
相关文章推荐
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 【Java】 英雄会第四届在线编程大赛·线上初赛:带通配符的数 Java实现
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- csdn第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- CSDN英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第二届在线编程大赛·线上初赛:AB数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- csdn 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第二届在线编程大赛·线上初赛:AB 题解
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 用python实现csdn第四届在线编程大赛·线上初赛:带通配符的数
- 第四届在线编程大赛·线上初赛:带通配符的数-我的解题方法
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 【思考题】CSDN第四届在线编程大赛2014初赛:带通配符的数
- 庞果英雄会第二届在线编程大赛·线上初赛:AB数
- pongo(csdn英雄会题解)之三元组的数量--英雄会第二届在线编程大赛·CSDN现场决赛